Число в двоичной (бинарной) системе исчисления представляет собой набор нулей и единиц. Самый правый бит, нулевой, называется младшим значащим битом (разрядом).
Число 5
будет выглядеть, как 00000101
.
Всего в наличии 6 побитовых операторов:
-
$a & $b
— И (получаем число в котором установлены биты, которые установлены в $a и в $b) -
$a | $b
— Или (получаем число в котором установлены биты, которые установлены в $a или в $b) -
$a ^ $b
— Исключающее или (число в котором установлены биты установленные в $a или в $b, но не в обоих одновременно) -
~$a
— Отрицание (инверсия, 1 меняется на 0, и наоборот) $a — Сдвиг влево (все биты в $a смещаются влево на количество позиций в $b)
-
$a >> $b
— Сдвиг вправо (все биты в $a смещаются вправо на количество позиций в $b)
Практика на примерах
Для большей наглядности рассмотрим в качестве примера, простую систему разграничения прав доступа к сайту.
У нас будут доступны следующие права доступа: Чтение, Создание, Редактирование, Удаление. То есть всего 4 значения, их можно представить в виде 4-х битного числа, в котором 1 — означает, что у пользователя есть данное право, а 0 — нет.
Для наглядности нарисовал картинку.
Определим для прав доступа следующие константы:
<? php define('U_READ', 1 << 0); // 0001 define('U_CREATE', 1 << 1); // 0010 define('U_EDIT', 1 << 2); // 0100 define('U_DELETE', 1 << 3); // 1000 define('U_ALL', U_READ | U_CREATE | U_EDIT | U_DELETE); // 1111 ?>
Установка значений битов
Присваиваем одно право.
<? php $user_perm = U_READ; // только право чтения ?>
Чтобы комбинировать несколько прав используем побитовый оператор ИЛИ.
<? php $user_perm = U_READ | U_DELETE; // можно читать и удалять ?>
Добавляем все права с помощью заготовленной константы.
<? php $user_perm = U_ALL; // все права ?>
Если нужно дать все права кроме одного или нескольких, то можно воспользоваться следующими операторами.
<? php $user_perm = U_ALL ^ U_DELETE; // все права кроме удаления $user_perm = U_ALL & ~ U_DELETE; // все права кроме удаления, в данном случае 2 оператора ?>
Разница между этими вариантами в том, что в первом случае просто переключается бит, если был 1, то станет 0, и наоборот.
Второй же вариант делает бит равным 0, независимо от его текущего значения.
Проверка значения бита
Выставлять биты мы уже научились, теперь рассмотрим как же их использовать, т.е. проверять значение. Для проверки наличия прав доступа используем побитовый оператор И
.
<? php if($user_perm & U_READ) // есть ли право чтения? ?>
Можно проверять значения сразу нескольких бит, к примеру
<? php if($user_perm & ( U_READ | U_DELETE )) // есть ли право чтения и/или удаления ?>
Сброс бита
Если мы хотим убрать какое-нибудь право доступа, то пишем так
<? php $user_perm &= ~ U_DELETE; // запретить удаление ?>
Ссылки
Опубликовано с позволения автора (zapimir). Оригинал находится на Хабре.
Источник: https://www.kobzarev.com/programming/bitwise-operators-in-php-by-example/