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
Копирование материалов с данного сайта возможно только с разрешения администрации сайта
и при указании прямой активной ссылки на источник.
2011-2016 © puzzleweb.ru

Реклама на сайте | puzinfo@puzzleweb.ru