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

Битовые операторы позволяют работать с поразрядным представлением аргументов.

ОператорИмяПримерРезультат
&And$x & $yЗадаются биты, которые установлены и в $x, и в $y.
|Or$x | $yЗадаются биты, которые установлены или в $x, или в $y.
^Xor$x ^ $yЗадаются биты, которые установлены в $x или в $y, но не в обоих сразу.
~Not~$xБиты, которые установлены в $x, не задаются. И наоборот.
<< Shift left$x << $yСмещение битов $x на $y шагов влево.#
>> Shift right$x >> $yСмещение битов $x на $y шагов вправо.*

# Каждый шаг означает «умножить на два».
* Каждый шаг означает «поделить на два».

Что такое бит?

В PHP битовых операциях бит (двоичный разряд) - это базовая единица информации, хранящаяся в вычислительной системе, которая существует в двух возможных состояниях, представленных как ON или OFF. В компьютерной системе состояние ON рассматривается как состояние 1, а OFF - 0. Эти состояния можно сравнить с двумя состояниями электрического переключателя (ВКЛ и ВЫКЛ) и т.п.

Значения задаются в двоичной системе исчисления. В десятичной системе построение числа основано на 10. Давайте посмотрим, как можно построить десятичное число -

231 = (2 ; 102 ) + (3 ; 101) + (1 ; 100)
= 200 + 30 + 1
= 231

Система двоичных чисел следует той же концепции. Единственное отличие состоит в том, что база равна 2, а не 10. Посмотрим, как двоичное число преобразовать в десятичное -

1011010=(1 x 26)+(0 x 25)+(1 x 24)+(1 x 23)+(0 x 22)+(1 x 21)+(0 x 20)
=(1 x 64) +(0 x 32)+(1 x 16)+(1 x 8)+(0 x 4)+(1 x 2)+(0 x 1)
=64+0+16+8+0+2+0
=90

Таким образом, (1011010)2= (90)10

Байт

Байт состоит из последовательности битов. Байт состоит из восьми битов. Максимальное значение байта составляет 255. Таким образом устанавливается значение места каждого бита.

Табличное представление байта

1 байт (8 бит)
 8-ой7-ой6-ой5-ый4-ый3-ий2-ой1-ый
Установленное значение1286432168421

Табличное представление байта, демонстрирующее, как максимальное значение байта в битовой операции с числами составляет 255:

1 байт (8 бит)
Установленное значение1286432168421  
 11111111  
 2726252423222120  
 1286432168421=255

Десятичное число 93 может быть представлено в двоичной форме:

1 байт (8 бит)
Установленное значение1286432168421  
 01011101  
 2726252423222120  
 0640168401=93

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

Пример побитового оператора PHP AND с одним общим битом

<?php  
$x=13;  
$y=22;  
echo $x & $y;  
?>

Результат примера:

4

Пояснение

Опираясь на приведенные выше таблицы битовых операций, можно сказать, что единственный общий бит находится на третьей позиции с установленным значением 4. Таким образом, $x & $y = 4:

1 байт (8 бит)
Установленное значение1286432168421  
$x00001101=13
$y00010110=22

В приведенной выше таблице для $x (13) установлено значение на первой, третьей и четвертой позиции. Значения позиции равны 1, 4 и 8. А для $y (22) значение установлено на второй, третьей и пятой позициях с соответствующими значениями: 2, 4 и 16.

Единственный бит, который является общим для $x и $y - это третий. Поэтому возвращается 4.

Рассмотрим другой пример оператора &, в котором больше бит.

Пример побитового оператора PHP AND с двумя общими битами

<?php  
$x=77;  
$y=198;  
echo $x & $y;  
?>

Результат примера PHP битовой операции:

68

Пояснение

1 байт (8 бит)
Place Value1286432168421  
$x01001101=77
$y11000110=198

В приведенной выше таблице значение установлено для $x (77) на первой, третьей, четвертой и седьмой позиции. Значения позиций равны 1, 4, 8 и 64. Значение для $y (198) установлено на второй, третьей, седьмой и восьмой позициях с соответствующими значениями: 2, 4, 64 и 128.

Из приведенной выше таблицы видно, что общие для $x и $y - это третий и седьмой биты. Таким образом, возвращается 64 + 4 = 68.

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

Пример побитового оператора PHP OR:

<?php  
$x=5;  
$y=11;  
echo $x | $y;  
?>

Результат примера:

15

Пояснение

1 байт (8 бит)
Place Value1286432168421  
$x00000101=5
$y00001011=11

В приведенной выше таблице битовой операции с числами для $x (5) значение установлено на первой и третьей позициях. Значения позиций соответственно равны 1 и 4. Для $y (11) значения установлены на первой, второй и четвертой позициях с соответствующим значением: 1, 2 и 8.

Для $x и $y общими являются первый, второй, третий или четвертый бит. Возвращаемое значение представляет собой добавление значений позиций битов, то есть: 8 + 4 + 2 + 1 = 15.

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

Оператор Xor также выполняет побитовое сравнение двух числовых выражений и в результате устанавливает общий бит. Когда одно и только одно выражение является истинным, тогда он возвращает true.

В приведенной ниже таблице показано, как выполняется операция XOR:

Выражение 1Выражение 2Результат
FalseFalseFalse
FalseTrueTrue
TrueFalseTrue
TrueTrueFalse

В приведенной ниже таблице показано побитовое сравнение оператора XOR:

Бит в Выражении 1Бит в Выражении 2Результат
000
011
101
1  

Пример использования побитового оператора PHP XOR

<?php  
$x=12;  
$y=11;  
echo $x ^ $y;  
?>

Результат примера PHP битовой операции:

7

Пояснение

1 байт (8 бит)
Значение позиции1286432168421  
$x00001100=12
$y00001011=11

В приведенной выше таблице для $x (12) установлено значение на третьей и четвертой позиции. Значения позиции равны 4 и 8. А для $y (11) значение задано на первой, второй и четвертой позиции с соответствующими значениями: 1, 2 и 8.

$ x и $ y устанавливают вместе первый, второй, третий или четвертый бит. Но вместе они используют только 4-й бит. Поэтому возвращаемое значение представляет собой добавление места для них. Но не совместно используемый бит: 4 + 2 + 1 = 7.

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

В приведенной ниже таблице будет показано, как оператор NOT выполняет операции с $x и $y и возвращает true, когда заданный в одном выражении бит не задан в другом выражении.

Пример использования побитового оператора PHP NOT после оператора AND

<?php  
$x=12;  
$y=10;  
echo $x & ~ $y;  
?>

Результат примера:

4

Пояснение

1 байт (8 бит)
Значение позиции1286432168421  
$x00001100=12
$y00001010=10

В приведенной выше таблице для $x (12) значение установлено на третьей и четвертой позициях. Значения позиции равны 4 и 8. Для $y (10) значение установлено на второй и четвертой позициях с соответствующими значениями 2 и 8.

Для $x и $y заданы биты на первой, второй, третьей и четвертой позициям, но общий для них только четвертый бит. Возвращаемое значение равно 4, так как это единственное значение, заданное для $x, но не заданное для $y.

Пример использования битовой операции PHP NOT перед оператором AND

<?php  
$x=12;  
$y=10;  
echo ~ $x &  $y;  
?>

Результат примера:

2

Пояснение

В этом случае возвращаемое значение равно 2, потому что бит установлен для $y, но не установлен для $x.

Сдвиг битов

Если a и b - это два числа. Оператор сдвига перемещает бит b на определенное количество позиций. Каждый шаг означает умножение на два (сдвиг влево). Если это сдвиг вправо, тогда каждый шаг означает деление на два.

Пример использования побитового оператора сдвига влево

<?php  
$x=8;  
$y=3;  
echo $x << $y;  
?>

Результат примера битовой операции

64

Пояснение

1 байт (8 бит)
Значение позиции1286432168421  
$x00001000=8
Результат01000000=64

В приведенном выше примере берется значение $x, которое равно 8, и выполняется операция сдвига влево: 8 умножается на 2 три раза. Таким образом, мы получаем 8 x 2 x 2 x 2 = 64.

Еще один пример использования оператора сдвига влево

<?php  
$x=12;  
$y=4;  
echo  $x << $y;  
?>

Результат примера:

192

Пояснение

В приведенном выше примере берется значение $x, равное 12, и выполняется операция сдвига влево: умножается на 2 четыре раза. Таким образом, мы получаем 12 x 2 x 2 x 2 x 2 = 192.

1 байт (8 бит)
Значение позиции1286432168421  
$x00001100=12
Результат11000000=192

Пример использования побитового оператора сдвига вправо

<?php  
$x=8;  
$y=3;  
echo $x >> $y;  
?>

Результат примера битовой операции с числами:

1

Пояснение

1 байт (8 бит)
Значение позиции1286432168421  
$x00001000=8
Результат00000001=1

В приведенном выше примере берется значение $x, которое равно 8, и выполняется операция сдвига вправо: 8 делится на 2 три раза. Таким образом, получаем 8/2 = 4/2 = 2/2 = 1.

Еще один пример использования оператора сдвига вправо

<?php  
$x=96;  
$y=5;  
echo  $x >> $y;  
?>

Результат примера:

3

Пояснение

1 байт (8 бит)
Значение позиции1286432168421  
$x01100000=96
Результат00000011=3

В приведенном выше примере берется значение $x, равное 96, и выполняется операция сдвига вправо: 96 делится на 2 пять раз. Таким образом, мы получаем 96/2 = 48/2 = 24/2 = 12/2 = 6/2 = 3.

Пример использования оператора сдвиг вправо с превышением значения шага

<?php  
$x=64;  
$y=7;  
echo  $x >> $y;   
?>

Результат примера PHP битовой операции:

0

Пояснение

1 байт (8 бит)
Значение позиции1286432168421  
$x01000000=64
Результат00000000=0

В приведенном выше примере берется значение $x, равное 64, и выполняется операция сдвига вправо: 64 делится на 2 семь раз. При делении в определенный момент нам нечего делить. Таким образом, результат равен 0.

Перевод статьи «PHP Bitwise operator» дружной командой проекта Сайтостроение от А до Я.

03 июля 2017 в 12:05
Материалы по теме
{"url":"http://www.fastvps.ru/", "src":"/images/advbanners/fastvps.png", "alt":"Хостинг Fastvps.ru. Наш выбор!"}
Заработок