Как сохранить и получить 3-битное число с помощью битовой маски?

Допустим, у меня есть немного маски

enum ExampleMask
{
Attribute1 = 1 << 1,
Attribute2 = 1 << 2,
...
Attribute27 = 1 << 27
}

Поэтому я уже использую 27 из моих 32 доступных битов.

Теперь я хочу иметь возможность хранить и извлекать 3-битное целое число без знака в дополнение к флагам, использующим битовую маску.

Например:

// Storing values
int mask =  Attribute2 | Attribute6 | Attribute18; // Saving some attributes
int mask |= ???? // How to save the number 8?

// Retrieving values
if(mask & Attribute2) do something...;
if(mask & Attribute6) do something...;
int storedValue =  ???? // How to retrieve the 8?

По сути, я хочу зарезервировать 3 бита в моей битовой маске, чтобы сохранить там число от 0 до 8

Спасибо, что нашли время, чтобы прочитать и помочь.

0

Решение

Вы можете просто сдвинуть значение в неиспользуемые биты, например,

Чтобы сохранить значение:

mask |= val << 28;

Чтобы получить значение:

val = mask >> 28;

Обратите внимание, что mask должно быть unsigned чтобы избежать распространения знакового бита при сдвиге. Если вам по какой-то причине нужно использовать подписанное int, вам следует добавить дополнительную операцию маскирования при получении valнапример,

val = (mask >> 28) & 0x0f;
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector