Побитовые операторы выполняют низкоуровневые манипуляции с битами в двоичных представлениях чисел. Эти операторы редко используются в программировании на PHP, поэтому если вы не знакомы с двоичным представлением целых чисел, то можете пропустить этот раздел. Побитовые операторы выполняют поразрядные операции булевой алгебры над отдельными битами операндов.
В наличии PHP есть 6 побитовых операторов:
Побитовое И (&)
Оператор &
выполняет операцию логическое И над каждым битом своих операндов. Бит результата устанавливается, если соответствующий бит установлен в обоих операндах.
Пример работы оператора «Побитовое И»:
И | 0011 |
0101 | |
0001 |
Тоже самое только на примере PHP:
<?php $x = 3; // . $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 |
С этой темой смотрят:
- Выражения и операторы
- Арифметические операторы
- Операторы сравнения
- Логические операторы
PHP: Побитовые операторы | PHP
0 ∞
Битовые операторы позволяют работать с поразрядным представлением аргументов. $y
# Каждый шаг означает «умножить на два».
* Каждый шаг означает «поделить на два».
- Что такое бит?
- Байт
- Табличное представление байта
- Побитовый оператор AND
- Пример побитового оператора PHP AND с одним общим битом
- Пример побитового оператора PHP AND с двумя общими битами
- Побитовый оператор OR
- Побитовый оператор XOR
- Пример использования побитового оператора PHP XOR
- Побитовый оператор NOT
- Пример использования побитового оператора PHP NOT после оператора AND
- Пример использования битовой операции PHP NOT перед оператором AND
- Сдвиг битов
- Пример использования побитового оператора сдвига влево
- Еще один пример использования оператора сдвига влево
- Пример использования побитового оператора сдвига вправо
- Еще один пример использования оператора сдвига вправо
- Пример использования оператора сдвиг вправо с превышением значения шага
- Байт
В 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 | 8 | 4 | 0 | 1 | = | 93 |
<?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 | 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 $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) на первой, третьей, четвертой и седьмой позиции.
Из приведенной выше таблицы видно, что общие для $x и $y — это третий и седьмой биты. Таким образом, возвращается 64 + 4 = 68.
Пример побитового оператора 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 также выполняет побитовое сравнение двух числовых выражений и в результате устанавливает общий бит. Когда одно и только одно выражение является истинным, тогда он возвращает 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 $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 выполняет операции с $x и $y и возвращает true, когда заданный в одном выражении бит не задан в другом выражении.
<?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 $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.
Вадим Дворниковавтор-переводчик статьи «PHP Bitwise operator»
Дайте знать, что вы думаете по данной теме в комментариях. За комментарии, отклики, подписки, лайки, дизлайки низкий вам поклон!
побитовых операторов в PHP | 5 лучших побитовых операторов в PHP, которые нужно знать
Как следует из названия, побитовые операторы в PHP используются для выполнения операций на битовом уровне над операндами, над которыми они должны работать. Это делается путем преобразования этих операндов в их битовый уровень, а затем над ними выполняются необходимые вычисления. Некоторые математические операции могут быть выполнены на этом битовом уровне, а не на уровне логического значения для быстрой обработки.
Лучшие побитовые операторы в PHP
Ниже перечислены некоторые побитовые операторы в PHP:
1. Побитовое И( & )
Двоичные операторы работают с двумя операндами. В PHP оператор побитового И принимает два числа в качестве входных операндов и выполняет И над каждым битом этих двух чисел. Результат будет логическим и 1, если оба бита равны 1, и 0 в любом другом случае.
Синтаксис :
$first_op & $sec_op
& — символ, используемый для выполнения этой операции.
Пример :
Вывод:
Ниже приведено двоичное представление чисел 61 и 32 в таблице. В соответствии с символом И он дает на выходе 1, только если оба бита содержат 1 и возвращают 0 в любом другом случае. Таким образом, как показано ниже, только 3-й бит соответствует условию, и, следовательно, окончательный вывод равен 32.
2.
Побитовое ИЛИ( | )Подобно двоичному И, побитовое ИЛИ принимает два числа в качестве входных операндов и выполняет операцию ИЛИ над каждым битом этих двух чисел, и результатом является логическое значение. Он возвращает 1, если один из битов или оба бита равны 1. Следовательно, результат будет 0, только если обе цифры равны 0.
Синтаксис :
$first_op | $sec_op
| является символическим представлением побитового ИЛИ.
Пример :
Вывод:
Ниже приведено двоичное представление 50 и 36 соответственно, как показано в таблице. В соответствии с операцией ИЛИ мы видим, что во 2-м, 3-м, 5-м и 6-м битах есть цифры, равные 1, поэтому соответствующая позиция ниже также будет 1, а остальные цифры заполнены 0, поскольку они не удовлетворяют условию . Следовательно, окончательный результат, который мы получаем, равен 54,9.0003
Разрядное значение | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$a | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 9)
и | б | ВЫХОД | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0 | $б;
?> Вывод: Ниже приведено двоичное представление чисел 22 и 31 соответственно, показанное в таблице. В приведенной ниже таблице мы видим, что в 5-м и 8-м битах один из битов равен 1, следовательно, на выходе эти биты равны 1, а остальные равны 0. Результирующий результат равен 9 при преобразовании в десятичное число.
4.Побитовое НЕ( ~ )В отличие от вышеперечисленных операторов, это унарный оператор, поэтому он выполняет побитовое НЕ над одним операндом, взятым на вход. Как следует из названия, вывод побитового НЕ является полной противоположностью его ввода. Синтаксис : ~ $first_op ~ используется для побитового НЕ. Пример : Вывод: В приведенном выше коде мы сначала выполняем побитовое НЕ со вторым оператором, а затем комбинируем его с побитовым И с первым оператором, чтобы получить вывод. В приведенной ниже таблице мы можем увидеть результат после того, как НЕ выполнено с $y, и окончательный вывод, который равен 20 в десятичном формате.
5.Сдвиг битовЭта операция немного отличается от описанных выше операций и включает сдвиг битов. Существует 2 типа смещения, которые могут быть выполнены: сдвиг влево и сдвиг вправо. Сдвиг влево(<< )Здесь входные биты сдвигаются влево на заданное количество разрядов. Синтаксис : $first_op << $n где $n указывает количество позиций, на которые должны быть сдвинуты биты. Пример : Вывод: Здесь мы задаем сдвиг двоичного числа 4 на 3 цифры влево. Следовательно, в результате мы получаем 32.
Сдвиг вправо ( >> )Здесь мы сдвигаем входные биты вправо на указанное количество позиций. Синтаксис : $first_op >> $n где $n — количество мест, на которое нужно сдвинуть. Пример : > $b; ?> Вывод: Здесь мы сдвигаем двоичную цифру 7 на два бита вправо. Следовательно, в результате мы получаем 1.
ВыводВыше мы рассмотрели все основные побитовые операции, используемые в PHP. Как следует из их названия, они могут работать только с каждым битом входных данных, а не с целыми числами. Они по-прежнему используются в современном кодировании, поскольку имеют несколько преимуществ по сравнению с нынешним объединением, поскольку хранение и выборка данных относительно меньше и, следовательно, также повышает производительность. Рекомендуемые статьиЭто руководство по битовым операторам в PHP. Здесь мы обсудим основную концепцию, различные побитовые операторы в PHP с примерами и синтаксисом. Вы также можете ознакомиться с другими нашими статьями по теме, чтобы узнать больше –
битов. Что означает >> в PHP?спросил Изменено 4 года, 6 месяцев назад Просмотрено 5к раз Рассмотрим: эхо 50 >> 4; Выход: 3 Почему выводится 3?
1 50 в двоичном виде равно См. документацию по PHP и Википедию. 3 Как указано на php.org,
50 в двоичном виде равно
Поскольку двоичное число 3 Арифметический сдвиг вправо. Оператор Сдвиг битов вправо 4 раза равен делению на два, четыре раза подряд. Результат в этом случае будет Иными словами, >> — бинарный оператор сдвига вправо. Ваша инструкция сдвигает биты в числовом значении 50 на четыре позиции вправо. Поскольку все целые числа представлены в дополнении до двух, это равно 3. Простой способ запомнить это состоит в том, что один сдвиг вправо равен делению на 2, а один сдвиг влево равен умножению на 2. 0 Это называется сдвиг вправо. 'Биты левого операнда сдвигаются вправо на количество позиций правого операнда. Освобожденные слева битовые позиции заполняются знаковым битом, а биты, сдвинутые вправо, отбрасываются». Информацию по нему можно найти здесь: http://php.comsci.us/etymology/operator/rightshift.php 1 Смещает биты вниз на четыре позиции. 50 в двоичном формате равно 110010. Сдвиг на четыре разряда вниз равен 11, что равно 3. Для вашего удобства один из самых быстрых способов вычислить выходное значение из побитового сдвига — умножить или разделить на 2. Например, Учитывая, что это побитовое право, это буквально означает, что значение будет уменьшаться, тогда мы можем получить результат, разделив 50 на 2 и 4 раза. Учитывая, что (от) 48 -> (до) 63/16(2*2*2*2), результат будет больше 2 и меньше 4. Тогда |