Урок 4.4. Поразрядные логические операции
4.4. Поразрядные логические операции
Поразрядные логические операции используются для работы с отдельными битами или группами бит данных. Поразрядные операции запрещено применять к данным float u double. В таблице 5.4 представлены поразрядные логические операции Си.
Таблица 5.4 Поразрядные логические операции
Название поразрядной логической операции | Знак операции в Си |
Поразрядное И | & |
Поразрядное ИЛИ | | |
Поразрядное исключающее ИЛИ | ^ |
Сдвиг влево | << |
Сдвиг вправо | >> |
Обращение(унарная операция) | ~ |
Поразрядная операция И (&) реализуется коньюнкцией над каждой парой битов данных. Например, если в программе есть описание переменных: int n,d;
и переменная n имеет значение 5, а переменная d имеет значение 6,то выражение n&d дает значение 4, ибо внутреннее представление значения переменной n - это 0000000000000101, а переменной d - это 0000000000000110. Результат применения к ним поразрядной операции И даст:
n 0000000000000101
d 0000000000000110
___ __________________
4 0000000000000100
Поразрядная операция И часто используется для выделения некоторой группы разрядов. Например, выражение: c=n&0177 гарантирует установку в нуль всех разрядов переменной с, кроме младших семи. Отметим, что здесь мы использовали операцию присваивания, которая будет рассматриваться далее.
Поразрядная операция ИЛИ (|)реализуется дизьюнкцией над каждой парой бит данных и часто используется для "включения" разрядов, например, выражения :
х=х|mask устанавливает в единицу те биты х, которым соответствуют единичные биты в mask.
Не следует путать поразрядные логические операции & и | с логическими операциями && и ||. Например, выражение 1&2 имеет значение 0, но выражение 1&&2 имеет значение 1. Если не ясно почему это так, то следует дополнительно разобраться в этих операциях.
Поразрядное исключающее ИЛИ (^) реализует над каждой парой битов данных операцию сложения по модулю 2. Операция поразрядного исключающего ИЛИ определяется таблицей 4.5.
Таблица 4.5 Исключающее ИЛИ
Бит первого операнда | Бит второго операнда | Бит результата |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
Операции сдвига влево ( << ) и вправо ( >> ) выполняют сдвиг левого операнда влево или вправо на число разрядов, задаваемое правым операндом.
При сдвиге влево освобождающиеся разряды заполняются нулями. Например, х<<2 сдвигает х влево на 2 разряда, заполняя оставшиеся нулями, что эквивалентно умножению на 4. В общем случае сдвинуть х на n разрядов влево это эквивалентно умножению значения х на 2 в степени n.
Сдвиг вправо величины без знака (unsigned) приводит к заполнению нулями освобождающихся битов. Сдвиг вправо величины со знаком на некоторых машинах приводит к размножению знакового разряда, а на других освобождающиеся разряды заполняются нулями. Си размножает знаковый разряд и поэтому для положительных чисел сдвиг на n разрядов эквивалентен делению на 2 в n-ой степени.
Унарная операция обращение (~) преобразует каждый единичный разряд в нулевой и наоборот. Например, выражение x=х&~077 установит в нуль шесть младших разрядов х.
Оставить комментарий