Битовые операторы по своему действию
похожи на логические, за тем только
исключением, что битовые операторы
производят действия, как и следовало
ожидать, над битами.
op1 & op2 - Оператор "И" сравнивает два
бита и генерирует результат "истина",
если оба бита равны 1, иначе - "ложь"
op1 | op2 - Оператор "ИЛИ" сравнивает два
бита и генерирует результат "истина",
если биты комплиментарные, иначе - "ложь".
op1 ^ op2 - Оператор "Исключающее ИЛИ"
сравнивает два бита и генерирует результат
"истина", если один из битов (или они
оба) равен 1, иначе - "ложь".
~op1 - Оператор "Дополнение"
используется для инверсии всех битов.
op1 >> op2 - Оператор "Сдвиг вправо"
сдвигает все биты операнда вправо, теряя
при этом правый крайний бит, - левый крайний
бит становится равным 0. Каждый сдвиг битов
операнда вправо равносилен его делению на 2.
op1 << op2 - Оператор "Сдвиг влево"
сдвигает все биты операнда влево, теряя при
этом левый крайний бит, - правый крайний бит
становится равным 0. Каждый сдвиг битов
операнда вправо равносилен его умножению
на 2.
Замечание - битовые операции могут
проводиться ТОЛЬКО над операндами целого
типа.
Битовые операторы используются, чтобы изменять значения отдельных битов операнда. Один байт компьютерной памяти на самом деле состоит из 8-и битов, каждый из которых можно рассматривать, как флаг, - потому что каждый бит может быть равен 0 или 1, - "истина" или "ложь". Флаговые переменные обычно используются для индикации статуса чего-либо. Например, если у вас имеется файл только для чтения, вы можете пометить этот факт заданием переменной-флага $readOnly, которая может быть равна только 1 либо 0. И задавая значение этой переменной в 0 или 1, вы можете определять этот файл как доступный для записи или же только для чтения. Но если у вас несколько флагов, то выделять под них несколько переменных было бы слишком расточительно. Лучше использовать в качестве флагов отдельные биты одной переменной. Таким образом, в одной "обычной" переменной вы можете хранить как бы несколько маленьких, значением любой из которых может быть только ноль или единица. Это наглядно демонстрируется ниже.