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