Что такое битовая маска
Битовая маска — это число, которое используется ради своего битового шаблона, а не значения. Каждая позиция бита обозначает один переключатель «вкл/выкл», поэтому одно целое число может хранить 8, 32 или 64 флага сразу. Права доступа (rwx), режимы открытия файлов, биты возможностей CPU, сетевые маски и наборы опций почти в любом C API — это битовые маски.
Бит n имеет значение 2ⁿ, поэтому маска с установленными битами 0, 2 и 7 равна 1 + 4 + 128 = 133 = 0x85 = 1000 0101. Чтобы получить константу в коде, единицу сдвигают в нужную позицию: 1 << 7.
Как использовать маску
| Задача | Решение |
|---|---|
| Проверить, установлен ли флаг | (value & FLAG) != 0 |
| Проверить, что установлены все флаги из набора | (value & MASK) == MASK |
| Установить флаг | value |= FLAG |
| Сбросить флаг | value &= ~FLAG |
| Переключить флаг | value ^= FLAG |
| Извлечь поле из битов 4–7 | (value >> 4) & 0xF |
| Собрать маску для битов lo..hi | ((1 << (hi - lo + 1)) - 1) << lo |
Как прочитать готовую маску
Переведите значение в двоичный вид и пронумеруйте биты справа, начиная с 0. Каждая единица — установленный флаг. Инструмент выше делает это для любого вставленного значения и показывает позиции компактным списком вроде 0-2, 5, 7.
Примеры
Вопросы
Почему номера битов начинаются с 0?
Потому что бит n имеет значение 2ⁿ, а 2⁰ = 1 — это самый правый бит. Нумерация с нуля делает арифметику согласованной: сдвиг на n ставит единицу в бит n.
В чём разница между битовой маской и битовым полем?
Битовая маска — это число, с которым выполняют AND или OR. Битовое поле — группа соседних битов внутри большего значения, которые вместе хранят небольшое число (например, биты 4–7 со значением 0–15). Чтобы прочитать или записать битовое поле, используют маску и сдвиг.
Сколько флагов помещается в целое число?
По одному на бит: 8 в байте, 32 в 32-битном int, 64 в 64-битном int. Если нужно больше, используйте массив целых чисел или специальный тип bitset.
Зачем писать 1 << n вместо самого числа?
Так видно, какой именно бит имеется в виду, и нельзя опечататься, получив другую степень двойки. Компилятор сворачивает выражение в константу, так что затрат во время выполнения нет.
Инструмент корректно работает с 64-битными масками?
Да. Он считает с целыми числами произвольной точности, поэтому все 64 бита точны, включая бит 63.