Книга: Язык программирования Си. Издание 3-е, исправленное
2.9 Побитовые операторы
2.9 Побитовые операторы
В Си имеются шесть операторов для манипулирования с битами. Их можно применять только к целочисленным операндам, т. е. к операндам типов char, short, int и long, знаковым и беззнаковым.
& - побитовое И
| - побитовое ИЛИ
^ - побитовое исключающее ИЛИ.
‹‹ - сдвиг влево.
›› - сдвиг вправо.
~ - побитовое отрицание (унарный).
Оператор & (побитовое И) часто используется для обнуления некоторой группы разрядов. Например
n = n & 0177;
обнуляет в n все разряды, кроме младших семи.
Оператор | (побитовое ИЛИ) применяют для установки разрядов; так,
x = x | SET_ON;
устанавливает единицы в тех разрядах x, которым соответствуют единицы в SET_ON.
Оператор ^ (побитовое исключающее ИЛИ) в каждом разряде установит 1, если соответствующие разряды операндов имеют различные значения, и 0, когда они совпадают.
Поразрядные операторы & и | следует отличать от логических операторов && и ||, которые при вычислении слева направо дают значение истинности. Например, если x равно 1, а y равно 2, то x & y даст нуль, а x && y - единицу.
Операторы ‹‹ и ›› сдвигают влево или вправо свой левый операнд на число битовых позиций, задаваемое правым операндом, который должен быть неотрицательным. Так, x ‹‹ 2 сдвигает значение x влево на 2 позиции, заполняя освобождающиеся биты нулями, что эквивалентно умножению x на 4. Сдвиг вправо беззнаковой величины всегда сопровождается заполнением освобождающихся разрядов нулями. Сдвиг вправо знаковой величины на одних машинах происходит с распространением знака ("арифметический сдвиг"), на других - с заполнением освобождающихся разрядов нулями ("логический сдвиг").
Унарный оператор ~ поразрядно "обращает" целое т. е. превращает каждый единичный бит в нулевой и наоборот. Например
x = x & ~077
обнуляет в x последние 6 разрядов. Заметим, что запись x & ~077 не зависит от длины слова, и, следовательно, она лучше, чем x & 0177700, поскольку последняя подразумевает, что x занимает 16 битов. Не зависимая от машины форма записи ~077 не потребует дополнительных затрат при счете, так как ~077 - константное выражение, которое будет вычислено во время компиляции.
Для иллюстрации некоторых побитовых операций рассмотрим функцию getbits(x, p, n), которая формирует поле в n битов, вырезанных из x, начиная с позиции p, прижимая его к правому краю. Предполагается, что 0-й бит - крайний правый бит, а n и p - осмысленные положительные числа. Например, getbits(x,4,3) вернет в качестве результата 4, 3 и 2-й биты значения x, прижимая их к правому краю. Вот эта функция:
/* getbits: получает n бит, начиная с p-й позиции */
unsigned getbits(unsigned x, int p, int n)
{
return (x ›› (p+1-n)) & ~(~0 ‹‹ n);
}
Выражение x ›› (р+1-n) сдвигает нужное нам поле к правому краю. Константа ~0 состоит из одних единиц, и ее сдвиг влево на n бит (~0 ‹‹ n) приведет к тому, что правый край этой константы займут n нулевых разрядов. Еще одна операция побитовой инверсии ~ позволяет получить справа n единиц.
Упражнение 2.6. Напишите функцию setbits(x, p, n, y), возвращающую значение x, в котором n битов, начиная с p-й позиции, заменены на n правых разрядов из y (остальные биты не изменяются).
Упражнение 2.7. Напишите функцию invert(x, p, n), возвращающую значение x с инвертированными n битами, начиная с позиции p (остальные биты не изменяются).
Упражнение 2.8. Напишите функцию rightrot (x, n), которая циклически сдвигает x вправо на n разрядов.
- 2.1 Имена переменных
- 2.2 Типы и размеры данных
- 2.3 Константы
- 2.4 Объявления
- 2.5 Арифметические операторы
- 2.6 Операторы отношения и логические операторы
- 2.7 Преобразования типов
- 2.8 Операторы инкремента и декремента
- 2.9 Побитовые операторы
- 2.10 Операторы и выражения присваивания
- 2.11 Условные выражения
- 2.12 Приоритет и очередность вычислений
- Операторы в Python
- Операторы побитовых логических операций и сдвига
- Побитовые операторы
- Операторы членства в Python:
- Операторы тождественности в Python:
- Булевы операторы
- Операторы сравнения
- Операторы сравнения в Python:
- Операторы равенства aрифметические, условные, побитовые, битового дополнения и сдвига
- Операторы
- Операторы присваивания в Python:
- Арифметические операторы