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-ый | |
| Установленное значение | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
Табличное представление байта, демонстрирующее, как максимальное значение байта в битовой операции с числами составляет 255:
| 1 байт (8 бит) | ||||||||||
| Установленное значение | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |||
| 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | |||
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | = | 255 | |
Десятичное число 93 может быть представлено в двоичной форме:
| 1 байт (8 бит) | ||||||||||
| Установленное значение | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | |||
| 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | |||
| 0 | 64 | 0 | 16 | 8 | 4 | 0 | 1 | = | 93 | |
Побитовый оператор AND
Пример побитового оператора PHP AND с одним общим битом
<?php
$x=13;
$y=22;
echo $x & $y;
?>Результат примера:
4
Пояснение
Опираясь на приведенные выше таблицы битовых операций, можно сказать, что единственный общий бит находится на третьей позиции с установленным значением 4. Таким образом, $x & $y = 4:
| 1 байт (8 бит) | ||||||||||
| Установленное значение | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| $x | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | = | 13 |
| $y | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | = | 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 Value | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| $x | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | = | 77 |
| $y | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | = | 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 Value | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| $x | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | = | 5 |
| $y | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | = | 11 |
В приведенной выше таблице битовой операции с числами для $x (5) значение установлено на первой и третьей позициях. Значения позиций соответственно равны 1 и 4. Для $y (11) значения установлены на первой, второй и четвертой позициях с соответствующим значением: 1, 2 и 8.
Для $x и $y общими являются первый, второй, третий или четвертый бит. Возвращаемое значение представляет собой добавление значений позиций битов, то есть: 8 + 4 + 2 + 1 = 15.
Побитовый оператор XOR
Оператор Xor также выполняет побитовое сравнение двух числовых выражений и в результате устанавливает общий бит. Когда одно и только одно выражение является истинным, тогда он возвращает true.
В приведенной ниже таблице показано, как выполняется операция XOR:
| Выражение 1 | Выражение 2 | Результат |
| False | False | False |
| False | True | True |
| True | False | True |
| True | True | False |
В приведенной ниже таблице показано побитовое сравнение оператора XOR:
| Бит в Выражении 1 | Бит в Выражении 2 | Результат |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 |
Пример использования побитового оператора PHP XOR
<?php
$x=12;
$y=11;
echo $x ^ $y;
?>Результат примера PHP битовой операции:
7
Пояснение
| 1 байт (8 бит) | ||||||||||
| Значение позиции | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| $x | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | = | 12 |
| $y | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | = | 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 бит) | ||||||||||
| Значение позиции | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| $x | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | = | 12 |
| $y | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | = | 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 бит) | ||||||||||
| Значение позиции | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| $x | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | = | 8 |
| Результат | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | = | 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 бит) | ||||||||||
| Значение позиции | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| $x | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | = | 12 |
| Результат | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | = | 192 |
Пример использования побитового оператора сдвига вправо
<?php
$x=8;
$y=3;
echo $x >> $y;
?>Результат примера битовой операции с числами:
1
Пояснение
| 1 байт (8 бит) | ||||||||||
| Значение позиции | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| $x | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | = | 8 |
| Результат | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | = | 1 |
В приведенном выше примере берется значение $x, которое равно 8, и выполняется операция сдвига вправо: 8 делится на 2 три раза. Таким образом, получаем 8/2 = 4/2 = 2/2 = 1.
Еще один пример использования оператора сдвига вправо
<?php
$x=96;
$y=5;
echo $x >> $y;
?>Результат примера:
3
Пояснение
| 1 байт (8 бит) | ||||||||||
| Значение позиции | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| $x | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | = | 96 |
| Результат | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | = | 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 бит) | ||||||||||
| Значение позиции | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
| $x | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | = | 64 |
| Результат | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | = | 0 |
В приведенном выше примере берется значение $x, равное 64, и выполняется операция сдвига вправо: 64 делится на 2 семь раз. При делении в определенный момент нам нечего делить. Таким образом, результат равен 0.
Комментарии