Битовые операции в PHP на примерах

Число в двоичной (бинарной) системе исчисления представляет собой набор нулей и единиц. Самый правый бит, нулевой, называется младшим значащим битом (разрядом).

  1. Практика на примерах
  2. Установка значений битов
  3. Проверка значения бита
  4. Сброс бита

Число 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/

Михаил Кобзарёв

Суровый русский тимлид. Жил в Магадане, в офисе московских веб студий и в Тульской деревне. Виртуозно знает WordPress, PHP, ООП, Vue.js и вот это вот все. Делает крутые высоконагруженные сайты, поэтому уже почти захватил весь рынок WordPress разработки в России. Не дает никому делать сайты без спроса. Ведет блог о разработке, дайджест в телеграмме и в ВК. Любит сиськи, баню и радиоэлектронику. 100% патриот (но это не точно). Тролль 542 уровня. Ездит в отпуск раз в 5 лет.

Добавить комментарий

%d такие блоггеры, как: