Как правильно было сказано, значениям типа Boolean достаточно одного бита для представления информации. Следовательно их можно "упаковать" в целочисленный тип.
Если взять, для примера, 32-битные целочисленные переменные, то их можно рассматривать как хранилища 32 булевых значений, где каждый бит - 0 и 1 - соответствует булевым значениям false и true. Такие булевые значения принято называть
флагами.
Код:
|
В скобках указаны числа в двоичном формате
2^0 = 1 (0001)
2^1 = 2 (0010)
2^2 = 4 (0100) |
Так как каждый бит числа является степенью двойки, то используют битовые операции для проверки определенного бита или его установки (в 0 или 1). Таблица сложения и умножения (побитовых) показывает как работают эти операции:
Код:
|
Битовое НЕ (ноль - не единица, единица - не ноль)
~ 0 = 1
~ 1 = 0
Побитовое И (только все единицы)
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
Побитовое ИЛИ (хотя бы одна единица)
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
Побитовое исключающее ИЛИ (только одна единица)
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0 |
Этих операций, практически, достаточно для работы с флагами. Обычно используют целочисленные константы, для удобства записанные в шестнадцатеричной системе. С помощью этих констант выставляют флаги в 1, снимают флаги и проверяют наличие/отсутсвие флагов.
Код:
|
F_DIRECTORY = 0x0200;
F_OWNER_READ = 0x0100;
F_OWNER_WRITE = 0x0080;
F_OWNER_EXEC = 0x0040;
...
var fileAttr = ...
// 1. Если содержимое каталога можно прочитать
if ( fileAttr & (F_OWNER_READ | F_DIRECTORY) ) {
...
// 2. Установить права записи в каталог
fileAttr = fileAttr | F_OWNER_WRITE
// 3. Запретить права записи каталог
fileAttr = fileAttr & ~ F_OWNER_WRITE |