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

В этой главе:

  • Побитовое И (&)

  • Побитовое ИЛИ (|)

  • Исключающее ИЛИ (^)

  • Побитовое НЕ (~)

  • Сдвиг влево (<<)

  • Сдвиг вправо (>>)

Побитовые операторы выполняют низкоуровневые манипуляции с битами в двоичных представлениях числел. Эти операторы редко используются в программировании на PHP, поэтому если вы не знакомы с двоичным представлением целых чисел, то можете пропустить этот раздел. Побитовые операторы выполняют поразрядные операции булевой алгебры над отдельными битами операндов.

В наличии PHP есть 6 побитовых операторов:

Побитовое И (&)

Оператор & выполняет операцию «логическое И» над каждым битом своих операндов. Бит результата устанавливается, если соответствующий бит установлен в обоих операндах.

Пример работы оператора «Побитовое И»:

И

0011

0101

 

 

0001

Тоже самое только на примере PHP:

1
2
3
4
5
6
7
8
<?php
 
  $x = 3;         // ...0011
  $y = 5;         // ...0101
 
  echo $x & $y;   // ...0001 (1)
 
?>

Побитовое ИЛИ (|)

Оператор | выполняет операцию «логическое ИЛИ» над каждым битом своих операндов. Бит результата устанавливается, если соответствующий бит установлен хотя бы в одном операнде.

Пример работы оператора «Побитовое И»:

ИЛИ

0011

0101

 

 

0111

Тоже самое только на примере PHP:

1
2
3
4
5
6
7
8
<?php
 
  $x = 3;         // ...0011
  $y = 5;         // ...0101
 
  echo $x | $y;   // ...0111 (7)
 
?>

Исключающее ИЛИ (^)

Оператор ^ выполняет операцию «исключающее ИЛИ» над каждым битом своих операндов. Бит результата устанавливается, если соответствующий бит установлен в одном (но не в обоих) из двух операндов.

Пример работы оператора «Исключающее ИЛИ»:

Искл. ИЛИ

0011

0101

 

 

0110

Тоже самое только на примере PHP:

1
2
3
4
5
6
7
8
<?php
 
  $x = 3;         // ...0011
  $y = 5;         // ...0101
 
  echo $x ^ $y;   // ...0110 (6)
 
?>

Побитовое НЕ (~)

Оператор ~ «побитовое НЕ» представляет собой унарный оператор, указываемый перед своим единственным операндом. Он выполняет инверсию всех битов операнда. Из-за способа представления целых со знаком в PHP применение оператора ~ к значению эквивалентно изменению его знака и вычитанию 1.

Пример работы оператора «Побитовое НЕ»:

НЕ

01

 

 

10

Тоже самое только на примере PHP:

1
2
3
4
5
6
7
<?php
 
  $y = 5;     // ...0101
 
  echo ~$y;   // ...1010 (-6)
 
?>

Осталось рассмотреть два оператора - сдвиг влево и сдвиг вправо. Эти операторы можно использовать для быстрого умножения и деления (каждая позиция подразумевает "умножение/деление на 2").

Сдвиг влево (<<)

Оператор << сдвигает все биты в первом операнде влево на количество позиций, указанное во втором операнде, который должен быть целым числом. Сдвиг значения влево на одну позицию эквивалентен умножению на 2, на две позиции - умножению на 4 и т.д.

Пример работы оператора «Сдвиг влево»:

1
2
3
4
5
6
7
8
<?php
 
  $y = 5;         // 000000101
 
  // тоже самое что и 5 * 4
  echo $y << 2;   // 000010100 (20)
 
?>

Сдвиг вправо (>>)

Оператор >> сдвигает все биты в первом операнде вправо на количество позиций, указанное во втором операнде, который должен быть целым числом. Сдвиг значения вправо на одну позицию эквивалентен делению на 2, на две позиции - делению на 4 и т.д.

Пример работы оператора «Сдвиг вправо»:

1
2
3
4
5
6
7
8
<?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