Таблица 4.3. Побитовые операторы
Символ операции |
Значение |
Использование |
~ |
Побитовое НЕ |
~expr |
<< |
Сдвиг влево |
expr1 << expr2 |
>> |
Сдвиг вправо |
expr1 >> expr2 |
& |
Побитовое И |
expr1 & expr2 |
^ |
Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ |
expr1 ^ expr2 |
| |
Побитовое ИЛИ |
expr1 | expr2 |
&= |
Побитовое И с присваиванием |
expr1 &= expr2 |
^= |
Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ с присваиванием |
expr1 ^= expr2 |
|= |
Побитовое ИЛИ с присваиванием |
expr1 |= expr2 |
<<= |
Сдвиг влево с присваиванием |
expr1 <<= expr2 |
>>= |
Сдвиг вправо с присваиванием |
expr1 >>= expr2 |
Побитовые операции рассматривают операнды как упорядоченные наборы битов, каждый бит может иметь одно из двух значений – 0 или 1. Такие операции позволяют программисту манипулировать значениями отдельных битов. Объект, содержащий набор битов, иногда называют битовым вектором. Он позволяет компактно хранить набор флагов – переменных, принимающих значение “да” “нет”. Например, компиляторы зачастую помещают в битовые векторы спецификаторы типов, такие, как const и volatile. Библиотека iostream использует эти векторы для хранения состояния формата вывода.
Как мы видели, в С++ существуют два способа работы со строками: использование C-строк и объектов типа string стандартной библиотеки – и два подхода к массивам: массивы встроенного типа и объект vector. При работе с битовыми векторами также можно применять подход, заимствованный из С, – использовать для представления такого вектора объект встроенного целого типа, обычно unsigned int, или класс bitset стандартной библиотеки С++. Этот класс инкапсулирует семантику вектора, предоставляя операции для манипулирования отдельными битами. Кроме того, он позволяет ответить на вопросы типа: есть ли “взведенные” биты (со значением 1) в векторе? Сколько битов “взведено”?
В общем случае предпочтительнее пользоваться классом bitset, однако, понимание работы с битовыми векторами на уровне встроенных типов данных очень полезно. В этом разделе мы рассмотрим применение встроенных типов для представления битовых векторов, а в следующем – класс bitset.