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

Побитовые операции в 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, если число – не отрицательное.

Потребность в таких операциях встречается достаточно редко.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: