§ 27. Битовые операции в языке программирования
Битовые операции также лежат в основе компьютерных устройств, так как на них основана логика работы логических вентилей — базовых элементов цифровых схем. Битовые операции по смыслу похожи на логические, но применяются для каждого разряда двоичного представления числа (бита) отдельно. Они определены только для целочисленных типов и не могут применяться к вещественным числам. В двоичном числе биты нумеруются справа налево, начиная с 0. С++ поддерживает все существующие битовые операции. (Рассмотрите пример 27.1.)
Таблицы истинности битовых и обычных логических операций И, ИЛИ, НЕ совпадают. Отличие лишь в том, что битовые операции выполняются над отдельными битами. Очевидно, что битовые операторы могут создать значения, отличные от 0 или 1. Логические же операторы всегда возвращают 0 или 1 (пример 27.2). Битовые операторы обычно не используются в условных операторах, которыми являются операторы отношения и логические операторы. Операторы сдвига >> и << сдвигают биты в переменной вправо и влево на указанное число. Общий вид оператора сдвига вправо: переменная >> число сдвигов; а общий вид оператора сдвига влево: переменная << число сдвигов; При побитовом сдвиге уходящий бит исчезает, не влияя на оставшиеся биты, а на месте появившегося бита записывается 0 (пример 27.3). При использовании битовых и логических операций, а также операций сравнения необходимо учитывать приоритет их выполнения (пример 27.4). Области применения битовых операций:
Рассмотрим использование битовых операций в С++ применительно к натуральным числам (примеры 27.9 — 27.16). Пример 27.9. Вычислить 2n + 2m.
а) сдвиг единицы влево на n позиций; б) сдвиг единицы влево на m позиций; в) побитовое OR с результатами сдвигов. Пример 27.10. Установить i-й бит числа A равным 1. Последовательно выполняется:
Пример 27.11. Инвертировать i-й бит числа A. Последовательно выполняется:
Пример 27.12. Установить i-й бит числа A равным 0. Последовательно выполняется:
Пример 27.13. Обнулить все биты числа A, кроме i битов. Последовательно выполняется:
Пример 27.14. Определить значение i-го бита числа A. Последовательно выполняется:
Пример 27.15. Посчитать количество единиц в двоичной записи числа A, заданного в десятичной системе счисления. Способ I
Способ II В цикле, который повторяем, пока A > 0, выполняем:
|
Пример 27.1. Выполнение битовых операций NOT, AND, OR, XOR.
Пример 27.3. Выполнение операций побитового сдвига.
Пример 27.4. Приоритет выполнения операций.
Пример 27.5. Если число является степенью двойки: int z = i & (i – 1) // z = 0 Если в двоичном представлении числа все единицы: int z = i & (i + 1) // z = 0 Пример 27.6. Обнуление крайнего правого единичного бита числа. A &= A - 1;
Пример 27.7. Обнуление крайних правых i бит числа.
Пример 27.8. Вычислить 2n.
1) n = m = 2:
A = 8. 2) n = 2, m = 3:
Пример 27.10.
A ^= (1 << i); 1) i = 3:
2) i = 2:
Пример 27.15. Вывести значение 8-разрядного числа побитно.
Способ I.
Способ II.
|