Побитовые операции в PHP выполняются над отдельными битами числа или строки (в компьютере строка представляется как двоичная последовательность кодов символов).
В PHP определены следующие побитовые операторы:
· "~" (оператор НЕ) – все биты со значением 0 в операнде меняют значение на 1, а все биты со значением 1 – на значение 0;
· "&" (оператор И) – бит в i-ой позиции поля результата равен 1 только, если оба бита в i-ых позициях операндов равны 1, иначе – равен 0;
· "|" (оператор ИЛИ) – бит в i-ой позиции поля результата равен 1, если хотя бы один из битов в i-ых позициях операндов равен 1, иначе – равен 0;
· "^" (оператор исключающее ИЛИ) – бит в i-ой позиции поля результата равен 1, только, если оба бита в i-ых позициях операндов не равны друг другу, иначе равен 0;
· ">>" (оператор сдвига вправо битов в левом операнде на количество битов, указанное в правом операнде);
· "<<" (оператор сдвига влево битов в левом операнде на количество битов, указанное в правом операнде).
|
|
Битовые операторы позволяют:
· инвертировать биты операнда;
· проверить биты поля или переменной на соответствие заданному шаблону (маске);
· установить заданные биты в 0 или 1;
· переключать заданные биты;
· смещать биты поля или переменной на заданную величину.
Для инвертирования битов операнда используется оператор "~" (НЕ) При этом, если бит операнда имеет значение 0, его значение меняется на 1, и наоборот.
Пример 4.6.26. Инвертирование числа:
$x = 0x13; /* $x=00010011 */
$y = ~$x; /* $y=11101100 или $y=0xEC */
Маска – это битовый шаблон, определенные биты которого установлены равными соответственно 0 или 1. Если выполнить над операндом и маской оператор "&" (И), то в тех позициях операнда, где значение соответствующего бита маски равно 1, бит результата не измениться, а позициях операнда, где значение соответствующего бита маски равно 0, бит результата будет всегда равен 0. Таким образом, использование маски позволяет определить значения битов в позициях, где значения бита маски равно 1, проигнорировав (замаскировав) значения остальных битов.
Пример 4.6.27. Использование маски:
Пусть необходимо проверить значения флажков 1 и 3 – битов в нулевой и второй позиции байта $x (позиция бита в байте отсчитывается справа налево, начиная с 0). Это можно сделать с помощью следующего фрагмента программы:
// Проверка установки флажков 1 и 3
$x = 0x13; // $x= 00010 0 1 1
$mask = 0x05; // $mask=00000101
$y = $x & $mask; // $y =00000 0 0 1
Как видно из комментария, флажок 1 включен (установлен в 1), а флажок 3 выключен (установлен в 0).
Установка определенных битов в 1 выполняется с помощью оператора "|" (ИЛИ). При выполнении этой операции те биты исходной переменной или поля, в которых в соответствующих позициях другого операнда стоит 1, в соответствующих позициях результата также будут стоять 1, а остальные биты исходной переменной переносятся в результат без изменения.
|
|
Пример 4.6.28. Установка бита в 1:
Следующий фрагмент программы устанавливает в $x флажок 3 в 1:
$x = 0x13; // $x= 00010 0 11
$set_flag3 = 0x04; // $set_flag3 = 00000100
$x = $x | $set_flag3; // $x= 00010 1 11
Установка определенных битов в 0 выполняется с помощью применения операции "&" к инвертированному операнду. При выполнении этой операции те биты исходной переменной или поля, в которых в соответствующих позициях другого операнда стоит 1, в соответствующих позициях результата будут стоять значения 0, а остальные биты исходной переменной переносятся в результат без изменения.
Пример 4.6.29. Установка бита в 0:
Следующий фрагмент программы устанавливает в $x флажок 1 в 0:
$x = 0x13; // $x= 0001001 1
$reset_flag1 = 0x01; // $reset_flag1= 00000001
$y = ~reset_flag1; // $y= 11111110
$x = $x & $y; // $x= 0001001 0
Под переключением бита подразумевается его установка в значение 0, если его первоначальное значение было равно 1, и наоборот. Для такого переключения используют операцию "^" (исключающее ИЛИ). При выполнении этой операции те биты исходной переменной или поля, в которых в соответствующих позициях другого операнда стоит 1, в соответствующих позициях результата будут изменены с 1 на 0 или с 0 на 1, а остальные биты исходной переменной переносятся в результат без изменения.
Пример 4.6.30. Переключение битов:
Следующий фрагмент программы переключает в $x флажки 1 и 3:
$x = 0x13; // $x= 00010 0 1 1
$switch1_3 = 0x05; // $switch1_3= 00000101
$x = $x ^ $switch1_3; // $x= 00010 1 1 0
Операции побитового смещения позволяют быстро умножить и разделить любое число на число, являющее степенью числа 2 (2, 4, 8, 16,…). Так, операция
число << n
умножает число на 2n, а операция
число >> n
делит число на 2n, если число – не отрицательное.
Потребность в таких операциях встречается достаточно редко.