Побитовые операции

В языке определены шесть операций над битовыми представлениями скалярных величин. Эти операции реализуют логические булевы функции над соответствующими битами двоичного представления скаляров. Бинарные операции (ИЛИ), & (И) и ^ (исключающее ИЛИ) осуществляют побитовое сравнение операндов, представленных целыми числами и строками. Унарная операция отрицания ~ (НЕ) выполняет инвертирование битов в представлении целых чисел и строк. Две операции сдвига битов >> (вправо) и << (влево) работают только с целыми числами и не применяются к строковым данным.

Числовые операнды

Если хотя бы один из операндов в бинарных операциях побитового логического сравнения является числом, то содержимое второго операнда также должно быть числом или строкой, содержащей правильный числовой литерал. Если строка не приводится к числовому значению, то операнду присваивается значение 0. После такого преобразования строк содержимое теперь уже числовых операндов преобразуется к целым числам простым отбрасыванием дробных частей.
ВНИМАНИЕ В отличие от арифметических операций, в операциях побитового сравнения строковый операнд должен содержать правильный числовой литерал, если один из операндов является числовым. Эти операции не выделят из строки вида "60km/h" целое 60, а будут рассматривать ее просто как целое 0.
Хотя Perl позволяет задавать целые числа с помощью десятичного, восьмеричного, шестнадцатеричного или двоичного их представления, все они хранятся в виде двоичных чисел, цифры которых и называются битами. Perl гарантирует, что все целые числа имеют длину не менее 32 битов, хотя на некоторых компьютерах они могут представляться и 64 битами. Именно с 32-битовым двоичным представлением целых чисел и работают побитовые операции.
Операция | реализует функцию побитового логического ИЛИ. Если хотя бы один из сравниваемых битов имеет значение 1, то соответствующий бит результата устанавливается равным 1, в противном случае (оба бита равны 0) значением бита результата будет 0.
Побитовая операция & реализует булеву функцию логического И для соответствующих битов двоичного представления числовых операндов: бит результата устанавливается равным 1, если оба сравниваемых бита равны 1, в других случаях результат равен 0.
Операция побитового исключающего ИЛИ ^ при сравнении соответствующих битов своих операндов дает значение 1 только тогда, когда точно один из них имеет значение 1, в остальных случаях результат равен 0.
Операция побитового логического отрицания ~ является унарной и ее действие заключается в инвертировании каждого бита в двоичном представлении операнда: 0 заменяется 1, а 1 переходит в 0. Результат этой операции зависит от разрядности процессора компьютера, так как она инвертирует все биты в представлении числа.
Бинарные операции побитового сдвига осуществляют сдвиг битов в двоичном представлении целого числа, заданного левым операндом, влево «или вправо» на количество бит, определяемых правым целочисленным операндом. При сдвиге вправо недостающие старшие биты, а при сдвиге влево младшие биты числа дополняются нулями. Биты, выходящие за разрядную сетку, пропадают:
       # Число 5:   (00000000000000000000000000000101)
5 >> 2 # Результат: (00000000000000000000000000000001) = 1
5 << 2 # Результат: (00000000000000000000000000010100) = 20
Все перечисленные побитовые операции работают и с отрицательными целыми числами, только при их использовании следует учитывать, что в памяти компьютера целые отрицательные числа хранятся в дополнительном коде. Двоичная запись неотрицательного целого числа называется прямым кодом. Обратным кодом называется запись, полученная поразрядной инверсией прямого кода. Отрицательные целые числа представляются в памяти компьютера в дополнительном коде, который получается прибавлением единицы к младшему разряду обратного кода. Например, представление числа -5 получается следующим образом:
00000000000000000000000000000101 # положительное число 5 
11111111111111111111111111111010 # обратный код числа 5 
11111111111111111111111111111011 # добавляем к младшему
   # разряду обратного кода 1
   # и получаем представление
   # числа -5

Строковые операнды

Четыре побитовые операции (~, |, & и ^) могут вычислять соответствующие булевы функции и над битовыми строками произвольной длины. В этом случае оба их операнда должны быть представлены строковыми литералами или переменными, содержащими строковые данные, причем результат интерпретируется как строка символов. Битовые строки формируются на основе ASCII-кодов символов, содержащихся в операндах-строках, с учетом того, что каждый символ представлен одним байтом.

Следующая страница Содержание главы


Реклама