PHP: Побитовые операторы
- Побитовое И (&)
- Побитовое ИЛИ (|)
- Исключающее ИЛИ (^)
- Побитовое НЕ (~)
- Сдвиг влево (<<)
- Сдвиг вправо (>>)
Побитовые операторы выполняют низкоуровневые манипуляции с битами в двоичных представлениях чисел. Эти операторы редко используются в программировании на PHP, поэтому если вы не знакомы с двоичным представлением целых чисел, то можете пропустить этот раздел. Побитовые операторы выполняют поразрядные операции булевой алгебры над отдельными битами операндов.
В наличии PHP есть 6 побитовых операторов:
Побитовое И (&)
Оператор &
выполняет операцию логическое И над каждым битом своих операндов. Бит результата устанавливается, если соответствующий бит установлен в обоих операндах.
Пример работы оператора «Побитовое И»:
И | 0011 |
0101 | |
0001 |
Тоже самое только на примере PHP:
<?php $x = 3; // ...0011 $y = 5; // ...0101 echo $x & $y; // ...0001 (1) ?>
Побитовое ИЛИ (|)
Оператор |
выполняет операцию логическое ИЛИ над каждым битом своих операндов. Бит результата устанавливается, если соответствующий бит установлен хотя бы в одном операнде.
Пример работы оператора «Побитовое И»:
ИЛИ | 0011 |
0101 | |
0111 |
Тоже самое только на примере PHP:
<?php $x = 3; // ...0011 $y = 5; // ...0101 echo $x | $y; // ...0111 (7) ?>
Исключающее ИЛИ (^)
Оператор ^
выполняет операцию исключающее ИЛИ над каждым битом своих операндов. Бит результата устанавливается, если соответствующий бит установлен в одном (но не в обоих) из двух операндов.
Пример работы оператора «Исключающее ИЛИ»:
Искл. ИЛИ | 0011 |
0101 | |
0110 |
Тоже самое только на примере PHP:
<?php $x = 3; // ...0011 $y = 5; // ...0101 echo $x ^ $y; // ...0110 (6) ?>
Побитовое НЕ (~)
Оператор ~
(побитовое НЕ) представляет собой унарный оператор, указываемый перед своим единственным операндом. Он выполняет инверсию всех битов операнда. Из-за способа представления целых со знаком в PHP применение оператора ~
к значению эквивалентно изменению его знака и вычитанию 1.
Пример работы оператора «Побитовое НЕ»:
НЕ | |
01 | |
10 |
Тоже самое только на примере PHP:
<?php $y = 5; // ...0101 echo ~$y; // ...1010 (-6) ?>
Осталось рассмотреть два оператора - сдвиг влево и сдвиг вправо. Эти операторы можно использовать для быстрого умножения и деления (каждая позиция подразумевает "умножение/деление на 2").
Сдвиг влево (<<)
Оператор <<
сдвигает все биты в первом операнде влево на количество позиций, указанное во втором операнде, который должен быть целым числом. Сдвиг значения влево на одну позицию эквивалентен умножению на 2, на две позиции - умножению на 4 и т.д.
Пример работы оператора «Сдвиг влево»:
<?php $y = 5; // 000000101 // тоже самое что и 5 * 4 echo $y << 2; // 000010100 (20) ?>
Сдвиг вправо (>>)
Оператор >>
сдвигает все биты в первом операнде вправо на количество позиций, указанное во втором операнде, который должен быть целым числом. Сдвиг значения вправо на одну позицию эквивалентен делению на 2, на две позиции - делению на 4 и т.д.
Пример работы оператора «Сдвиг вправо»:
<?php $y = 20; // 000010100 // тоже самое что и 20 / 4 echo $y >> 2; // 000000101 (5) ?>
Помимо описанных операторов, в PHP также предусмотрены и сокращенные формы записи побитовых операторов.
Оператор | Описание | Пример | Сокращенная форма записи |
---|---|---|---|
&= | Присваивает левому операнду результат работы Побитового И | $x = $x & $y | $x &= $y |
|= | Присваивает левому операнду результат работы Побитового ИЛИ | $x = $x | $y | $x |= $y |
^= | Присваивает левому операнду результат работы Исключающего ИЛИ | $x = $x ^ $y | $x ^= $y |
>>= | Присваивает левому операнду результат работы оператора Сдвига вправо | $x = $x >> 6 | $x >>= 6 |
<<= | Присваивает левому операнду результат работы оператора Сдвига влево | $x = $x << 6 | $x <<= 6 |
С этой темой смотрят: