Допустим, у меня есть немного маски
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
Спасибо, что нашли время, чтобы прочитать и помочь.
Вы можете просто сдвинуть значение в неиспользуемые биты, например,
Чтобы сохранить значение:
mask |= val << 28;
Чтобы получить значение:
val = mask >> 28;
Обратите внимание, что mask
должно быть unsigned
чтобы избежать распространения знакового бита при сдвиге. Если вам по какой-то причине нужно использовать подписанное int, вам следует добавить дополнительную операцию маскирования при получении val
например,
val = (mask >> 28) & 0x0f;
Других решений пока нет …