Допустим, у вашего беззнакового целого 32 бита:
#define SET_FLYING(x) (x) |= (1<<31)
#define SET_GROUNDED(x) (x) &= ~(1<<31)
#define IS_FLYING(x) ((x) & (1<<31))
#define ID(x) ((x) & ~(1<<31))
Если вы хотите быть более стильным в c ++, вы можете написать их как встроенные функции. Во всяком случае, я написал больше, чтобы показать вам, как выполняется битовая манипуляция, а не реализовывать ее как макрос или как функцию.
Чтобы заставить его работать с различными размерами int, вы можете изменить 31 на:
instead of 31: ((sizeof(x)<<3)-1)
Что в основном sizeof(x)*8-1
P.S. Если кто-то хочет сказать мне: «Нет, нет! Не используйте макросы, это C ++, используйте эту чрезмерно сложную вещь, которую я написал», сохраните свое дыхание. Просто дайте -1 и идите дальше.
edit : То, что я написал выше, было ответом на ваш вопрос: «Как использовать знаковый бит в качестве флага». Если вы хотите сделать это лучше, но не увеличивайте использование памяти (добавив bool
), вы всегда можете написать что-то вроде этого:
struct airplane
{
unsigned int id: 31;
unsigned int is_flying: 1;
};
airplane Boing = {777, false};
Затем, присвоение и чтение из id
или is_flying
выполняет битовые операции, но они обрабатываются компилятором.