Показать сообщение отдельно
  #40 (permalink)  
Старый 05.09.2010, 12:16
Профессор
Отправить личное сообщение для with-love-from-siberia Посмотреть профиль Найти все сообщения от with-love-from-siberia
 
Регистрация: 14.12.2009
Сообщений: 155

Как правильно было сказано, значениям типа 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

Последний раз редактировалось with-love-from-siberia, 05.09.2010 в 12:40.
Ответить с цитированием