В языке предусмотрен ряд операций для работы с битами; эти операции нельзя применять к переменным типа float или double.
& | Побитовое AND |
\! | Побитовое включающее OR |
^ | побитовое исключающее OR |
<< | сдвиг влево |
>> | сдвиг вправо |
\^ | дополнение (унарная операция) |
"\" имитирует вертикальную черту.
Побитовая операция and часто используется для маскирования некоторого множества битов; например, оператор
c = n & 0177
передает в 'с' семь младших битов n, полагая остальные равными нулю. Операция '|' побитового or используется для включения битов:
c = x | mask
устанавливает на единицу те биты в х, которые равны единице в mask.
Следует быть внимательным и отличать побитовые операции & и | от логических связок && и ||, которые подразумевают вычисление значения истинности слева направо. Например, если х=1, а y=2, то значение х&y равно нулю, в то время как значение x&&y равно единице./почему?/
Операции сдвига << и >> осуществляют соответственно сдвиг влево и вправо своего левого операнда на число битовых позиций, задаваемых правым операндом. Таким образом , х<<2 сдвигает х влево на две позиции, заполняя освобождающиеся биты нулями, что эквивалентно умножению на 4. Сдвиг вправо величины без знака заполняет освобождающиеся биты на некоторых машинах, таких как PDP-11, заполняются содержанием знакового бита /"арифметический сдвиг"/, а на других - нулем /"логический сдвиг"/.
Унарная операция \^ дает дополнение к целому; это означает , что каждый бит со значением 1 получает значение 0 и наоборот. Эта операция обычно оказывается полезной в выражениях типа
x & \^077
где последние шесть битов х маскируются нулем. Подчеркнем, что выражение x&\^077 не зависит от длины слова и поэтому предпочтительнее, чем, например, x&0177700, где предполагается, что х занимает 16 битов. Такая переносимая форма не требует никаких дополнительных затрат, поскольку \^077 является константным выражением и, следовательно, обрабатывается во время компиляции.
Чтобы проиллюстрировать использование некоторых операций с битами, рассмотрим функцию getbits(x,p,n), которая возвращает /сдвинутыми к правому краю/ начинающиеся с позиции р поле переменной х длиной n битов. Мы предполагаем, что крайний правый бит имеет номер 0, и что n и р - разумно заданные положительные числа. Например, getbits(х,4,3) возвращает сдвинутыми к правому краю биты, занимающие позиции 4,3 и 2.