Основы программирования


Побитовые логические операции - часть 2


При побитовом логическом умножении константа MASK_D обнуляет все биты слова x, кроме бита D, т.е. как бы вырезает бит D из x. В двоичном представлении это выглядит примерно так:

x: 0101110110...10*101 MASK_D: 0000000000...001000 x & MASK_D: 0000000000...00*000

Звездочкой здесь обозначено произвольное значение бита D слова x.

Для установки бита D в слове x используется операция побитового логического сложения:

x = (x | MASK_D); // Установить бит D в слове x

Чаще это записывается с использованием операции |= типа "увеличить на" (см. раздел 3.4.4):

x |= MASK_D; // Установить бит D в слове x

В двоичном виде это выглядит так:

x: 0101110110...10*101 MASK_D: 0000000000...001000 x | MASK_D: 0101110110...101101

Операция побитового отрицания "~" инвертирует биты слова:

x: 0101110110...101101 ~x: 1010001001...010010

Для очистки (т.е. установки в ноль) бита D используется комбинация операций побитового отрицания и побитового логического умножения:

x = (x & ~MASK_D); // Очистить бит D в слове x

или, применяя операцию "&=" типа "домножить на":

x &= ~MASK_D; // Очистить бит D в слове x

Здесь сначала инвертируется маска, соответствующая биту D,

MASK_D: 0000000000...001000 ~MASK_D: 1111111111...110111

в результате получаются единицы во всех битах, кроме бита D. Затем слово x побитно домножается на инвертированную маску:

x: 0101110110...10*101 ~MASK_D: 1111111111...110111 x & ~MASK_D: 0101110110...100101

В результате в слове x бит D обнуляется, а остальные биты остаются неизменными.

Приоритеты побитовых операций в Си выбраны достаточно странно (они такие же, как у соответствующих логических операций), это иногда приводит к неожиданным ошибкам. Например, если не заключить в скобки операцию побитового умножения в приведенном выше примере, то получится ошибочный результат: строка

if (x & MASK_D != 0) {

эквивалентна строке

if ((x & 1) != 0) {

т.е. проверяется бит A, а вовсе не D! Дело в том, что приоритет операции сравнения != выше, чем операции побитового умножения &, т.е.


Начало  Назад  Вперед



Книжный магазин