Побітові оператори
Побітові оператори дозволяють зчитувати та встановлювати конкретні біти цілих чисел.
Побітові оператори
Приклад | Название | Результат |
---|---|---|
$a & $b | І | Біти, встановлені і в змінній $a, і в змінній $b. |
**`$a | $b`** | Або |
$a ^ $b | Виключне або | Будуть задані біти, які встановлені або лише в змінній $a, або тільки в змінній $b, але не в обох одночасно. |
~ $a | Заперечення | Будуть задані біти, які не встановлені у змінній $a, і навпаки. |
$a << $b | Зрушення вліво | Усі біти змінної $a зсуваються вліво на кількість позицій, зазначених у змінній $b (кожна позиція передбачає «множення на 2») |
$a >> $b | Зсув праворуч | Усі біти змінної $a зсуваються вправо на кількість позицій, зазначених у змінній $b (кожна позиція передбачає «розподіл на 2») |
Побітове зрушення в PHP - це арифметична операція. Біти, зрушені межі числа, відкидаються. Зсув вліво доповнює число нулями праворуч, при цьому зсуваючи знаковий біт числа вліво, що означає, що знак операнда не зберігається. Зсув праворуч зберігає копію зрушеного знакового біта зліва, що означає, що знак операнда зберігається.
Пріоритет операторів змінюють дужками. Наприклад, вираз $a & $b == true
спочатку перевіряє на рівність, а потім виконує побітове "І"; тоді як вираз ($a & $b) == true
спочатку виконує побітове "І", а потім виконує перевірку на рівність.
Если оба операнда для операторов&
и^
Рядки, то операція буде проведена з кодами ASCII всіх символів рядка і в результаті поверне рядок. У всіх інших випадках, обидва операнди будуть перетворені на ціле і результатом буде ціле число.
Якщо операнд для оператора ~
рядок, то операція буде проведена з кодами ASCII всіх символів рядка і в результаті поверне рядок, інакше як операнд, так і результат будуть вважатися цілими.
І операнди, і результат виконання операторів <<
и>>
розглядаються як цілі числа.
В PHP ini-настройка error\_reporting использует побитовые значения,
показывая, как практически снимать значения битов.
Чтобы показать все ошибки, кроме замечаний,
инструкции в файле php.ini говорят, что нужно указать:
**`E_ALL & ~E_NOTICE`**
Начинаем со значения E\_ALL:
00000000000000000111011111111111
Затем берём значение E\_NOTICE...
00000000000000000000000000001000
... и инвертируем его оператором `~`:
11111111111111111111111111110111
Наконец, указываем побитовое И (&), чтобы установить только те биты,
которые установлены в единицу в обоих значениях:
00000000000000000111011111110111
Другой способ достичь этого — использовать ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR, `^`),
чтобы получить только те биты, которые установлены в единицу
либо только в одном, либо только в другом значении:
**`E_ALL ^ E_NOTICE`**
Через настройку опции error\_reporting можно также показать,
как устанавливать биты. Показать только ошибки и обрабатываемые ошибки можно
так:
**`E_ERROR | E_RECOVERABLE_ERROR`**
Здесь процесс сочетает E\_ERROR
00000000000000000000000000000001
и
00000000000000000001000000000000
через оператор ИЛИ (`|`),
чтобы получить биты, установленные хотя бы в одном операнде:
00000000000000000001000000000001
Приклад #1 Побітові операції І, АБО і ВИКЛЮЧНЕ АБО (AND, OR і XOR) над цілими числами
Loading...
Результат виконання наведеного прикладу:
--------- --------- -- ---------
result value op test
--------- --------- -- ---------
Побитовое И
( 0 = 0000) = ( 0 = 0000) & ( 5 = 0101)
( 1 = 0001) = ( 1 = 0001) & ( 5 = 0101)
( 0 = 0000) = ( 2 = 0010) & ( 5 = 0101)
( 4 = 0100) = ( 4 = 0100) & ( 5 = 0101)
( 0 = 0000) = ( 8 = 1000) & ( 5 = 0101)
Побитовое ИЛИ
( 5 = 0101) = ( 0 = 0000) | ( 5 = 0101)
( 5 = 0101) = ( 1 = 0001) | ( 5 = 0101)
( 7 = 0111) = ( 2 = 0010) | ( 5 = 0101)
( 5 = 0101) = ( 4 = 0100) | ( 5 = 0101)
(13 = 1101) = ( 8 = 1000) | ( 5 = 0101)
Побитовое исключающее ИЛИ (XOR)
( 5 = 0101) = ( 0 = 0000) ^ ( 5 = 0101)
( 4 = 0100) = ( 1 = 0001) ^ ( 5 = 0101)
( 7 = 0111) = ( 2 = 0010) ^ ( 5 = 0101)
( 1 = 0001) = ( 4 = 0100) ^ ( 5 = 0101)
(13 = 1101) = ( 8 = 1000) ^ ( 5 = 0101)
Приклад #2 Побітова операція ВИКЛЮЧАЛЬНЕ АБО (XOR) над рядками
Loading...
Приклад #3 Зсув бітів у цілих числах
Loading...
Результат виконання наведеного прикладу на 32-бітових машинах:
--- СДВИГ ВПРАВО НАД ПОЛОЖИТЕЛЬНЫМИ ЦЕЛЫМИ (НАТУРАЛЬНЫМИ) ЧИСЛАМИ ---
Выражение: 2 = 4 >> 1
Десятичный вид:
val=4
res=2
Двоичный вид:
val=00000000000000000000000000000100
res=00000000000000000000000000000010
ЗАМЕЧАНИЕ: слева была вставлена копия знакового бита
Выражение: 1 = 4 >> 2
Десятичный вид:
val=4
res=1
Двоичный вид:
val=00000000000000000000000000000100
res=00000000000000000000000000000001
Выражение: 0 = 4 >> 3
Десятичный вид:
val=4
res=0
Двоичный вид:
val=00000000000000000000000000000100
res=00000000000000000000000000000000
ЗАМЕЧАНИЕ: биты были выдвинуты за правый край
Выражение: 0 = 4 >> 4
Десятичный вид:
val=4
res=0
Двоичный вид:
val=00000000000000000000000000000100
res=00000000000000000000000000000000
ЗАМЕЧАНИЕ: то же, что и выше; нельзя сдвинуть дальше 0
--- СДВИГ ВПРАВО НА ОТРИЦАТЕЛЬНЫХ ЦЕЛЫХ ЧИСЛАХ ---
Выражение: -2 = -4 >> 1
Десятичный вид:
val=-4
res=-2
Двоичный вид:
val=11111111111111111111111111111100
res=11111111111111111111111111111110
ЗАМЕЧАНИЕ: слева была вставлена копия знакового бита
Выражение: -1 = -4 >> 2
Десятичный вид:
val=-4
res=-1
Двоичный вид:
val=11111111111111111111111111111100
res=11111111111111111111111111111111
ЗАМЕЧАНИЕ: биты были выдвинуты за правый край
Выражение: -1 = -4 >> 3
Десятичный вид:
val=-4
res=-1
Двоичный вид:
val=11111111111111111111111111111100
res=11111111111111111111111111111111
ЗАМЕЧАНИЕ: то же, что и выше; нельзя сдвинуть дальше -1
--- СДВИГ ВЛЕВО НАД ПОЛОЖИТЕЛЬНЫМИ ЦЕЛЫМИ (НАТУРАЛЬНЫМИ) ЧИСЛАМИ ---
Выражение: 8 = 4 << 1
Десятичный вид:
val=4
res=8
Двоичный вид:
val=00000000000000000000000000000100
res=00000000000000000000000000001000
ЗАМЕЧАНИЕ: правый край был дополнен нулями
Выражение: 1073741824 = 4 << 28
Десятичный вид:
val=4
res=1073741824
Двоичный вид:
val=00000000000000000000000000000100
res=01000000000000000000000000000000
Выражение: -2147483648 = 4 << 29
Десятичный вид:
val=4
res=-2147483648
Двоичный вид:
val=00000000000000000000000000000100
res=10000000000000000000000000000000
ЗАМЕЧАНИЕ: знаковые биты были выдвинуты
Выражение: 0 = 4 << 30
Десятичный вид:
val=4
res=0
Двоичный вид:
val=00000000000000000000000000000100
res=00000000000000000000000000000000
ЗАМЕЧАНИЕ: биты были выдвинуты за левый край
--- СДВИГ ВЛЕВО НАД ОТРИЦАТЕЛЬНЫМИ ЦЕЛЫМИ ЧИСЛАМИ ---
Выражение: -8 = -4 << 1
Десятичный вид:
val=-4
res=-8
Двоичный вид:
val=11111111111111111111111111111100
res=11111111111111111111111111111000
ЗАМЕЧАНИЕ: правый край был дополнен нулями
Выражение: -2147483648 = -4 << 29
Десятичный вид:
val=-4
res=-2147483648
Двоичный вид:
val=11111111111111111111111111111100
res=10000000000000000000000000000000
Выражение: 0 = -4 << 30
Десятичный вид:
val=-4
res=0
Двоичный вид:
val=11111111111111111111111111111100
res=00000000000000000000000000000000
ЗАМЕЧАНИЕ: биты были выдвинуты за левый край, включая знаковый бит
Результат виконання наведеного прикладу на 64-бітних машинах:
--- СДВИГ ВПРАВО НАД ПОЛОЖИТЕЛЬНЫМИ ЦЕЛЫМИ (НАТУРАЛЬНЫМИ) ЧИСЛАМИ ---
Выражение: 2 = 4 >> 1
Десятичный вид:
val=4
res=2
Двоичный вид:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000010
ЗАМЕЧАНИЕ: слева была вставлена копия знакового бита
Выражение: 1 = 4 >> 2
Десятичный вид:
val=4
res=1
Двоичный вид:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000001
Выражение: 0 = 4 >> 3
Десятичный вид:
val=4
res=0
Двоичный вид:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000000
ЗАМЕЧАНИЕ: биты были выдвинуты за правый край
Выражение: 0 = 4 >> 4
Десятичный вид:
val=4
res=0
Двоичный вид:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000000
ЗАМЕЧАНИЕ: то же, что и выше; нельзя сдвинуть дальше 0
--- СДВИГ ВПРАВО НАД ОТРИЦАТЕЛЬНЫМИ ЦЕЛЫМИ ЧИСЛАМИ ---
Выражение: -2 = -4 >> 1
Десятичный вид:
val=-4
res=-2
Двоичный вид:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111110
ЗАМЕЧАНИЕ: слева была вставлена копия знакового бита
Выражение: -1 = -4 >> 2
Десятичный вид:
val=-4
res=-1
Двоичный вид:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111111
ЗАМЕЧАНИЕ: биты были выдвинуты за правый край
Выражение: -1 = -4 >> 3
Десятичный вид:
val=-4
res=-1
Двоичный вид:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111111
ЗАМЕЧАНИЕ: то же, что и выше; нельзя сдвинуть дальше -1
--- СДВИГ ВЛЕВО НАД ПОЛОЖИТЕЛЬНЫМИ ЦЕЛЫМИ (НАТУРАЛЬНЫМИ) ЧИСЛАМИ ---
Выражение: 8 = 4 << 1
Десятичный вид:
val=4
res=8
Двоичный вид:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000001000
ЗАМЕЧАНИЕ: правый край был дополнен нулями
Выражение: 4611686018427387904 = 4 << 60
Десятичный вид:
val=4
res=4611686018427387904
Двоичный вид:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0100000000000000000000000000000000000000000000000000000000000000
Выражение: -9223372036854775808 = 4 << 61
Десятичный вид:
val=4
res=-9223372036854775808
Двоичный вид:
val=0000000000000000000000000000000000000000000000000000000000000100
res=1000000000000000000000000000000000000000000000000000000000000000
ЗАМЕЧАНИЕ: знаковые биты были выдвинуты
Выражение: 0 = 4 << 62
Десятичный вид:
val=4
res=0
Двоичный вид:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000000
ЗАМЕЧАНИЕ: биты были выдвинуты за левый край
--- СДВИГ ВЛЕВО НАД ОТРИЦАТЕЛЬНЫМИ ЦЕЛЫМИ ЧИСЛАМИ ---
Выражение: -8 = -4 << 1
Десятичный вид:
val=-4
res=-8
Двоичный вид:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111000
ЗАМЕЧАНИЕ: правый край был дополнен нулями
Выражение: -9223372036854775808 = -4 << 61
Десятичный вид:
val=-4
res=-9223372036854775808
Двоичный вид:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1000000000000000000000000000000000000000000000000000000000000000
Выражение: 0 = -4 << 62
Десятичный вид:
val=-4
res=0
Двоичный вид:
val=1111111111111111111111111111111111111111111111111111111111111100
res=0000000000000000000000000000000000000000000000000000000000000000
ЗАМЕЧАНИЕ: биты были выдвинуты за левый край, включая знаковый бит
Увага
Для побітових операцій над числами, більшими за значення константи PHP_INT_MAX
, викликають функції модуля gmp