С Здесь (Общий ответ, чтобы начать эту тему)
Битовая маска - это значение (которое может храниться в переменной), которое позволяет вам выделить определенный набор битов в целочисленном типе.
Обычно в маскируемых битах, которые вы интересуете, установлено значение 1, а во всех остальных битах - 0. Маска затем позволяет изолировать значение битов, очистить все биты или установить все биты или установить новое значение в битах.
Маски (особенно многобитовые) часто имеют ассоциированное значение сдвига, которое представляет собой величину, с которой биты должны сдвигаться влево, так что наименее значимый маскированный бит смещается к младшему значащему биту в типе.
Например, используя 16-битный короткий тип данных, предположим, что вы хотите иметь возможность маскировать биты 3, 4 и 5 (младший бит равен 0). Вы маскируете и сдвиг выглядел бы как
#define MASK 0x0038
#define SHIFT 3
Маски часто назначаются в шестнадцатеричном формате, потому что с битами в типе данных в этой базе проще работать, чем с десятичными. Исторически восьмеричное также использовалось для битовых масок.
Если у меня есть переменная var, которая содержит данные, к которым относится маска, тогда я могу выделить биты следующим образом
var & MASK
Я могу выделить все остальные биты, как это
var & ~MASK
Я могу очистить биты, как это
var &= ~MASK;
Я могу очистить все остальные биты, как это
var &= MASK;
Я могу установить все биты вот так
var |= MASK;
Я могу установить все остальные биты вот так
var |= ~MASK;
Я могу извлечь десятичное значение битов, как это
(var & MASK) >> SHIFT
Я могу присвоить битам новое значение, как это
var &= ~MASK;
var |= (newValue << SHIFT) & MASK;