phpcode
Время для прочтения: 1 мин. 34 сек.

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

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

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

Число 5 будет выглядеть, как 00000101.

Всего в наличии 6 побитовых операторов:

  • $a & $b — И (получаем число в котором установлены биты, которые установлены в $a и в $b)
  • $a | $b — Или (получаем число в котором установлены биты, которые установлены в $a или в $b)
  • $a ^ $b — Исключающее или (число в котором установлены биты установленные в $a или в $b, но не в обоих одновременно)
  • ~$a — Отрицание (инверсия, 1 меняется на 0, и наоборот)
  • $a < < $b — Сдвиг влево (все биты в $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). Оригинал находится на Хабре.

Для вставки кода используйте HTML-теги
<pre><code class="php">ваш код</code></pre>

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

Такой e-mail уже зарегистрирован. Воспользуйтесь формой входа или введите другой.

Вы ввели некорректные логин или пароль

Извините, для комментирования необходимо войти.

2 комментария

по хронологии
по рейтингу сначала новые по хронологии

а бы почему сброс бита не вот так сделать?

$user_perm ^= U_DELETE;

С этим вопросом ван надо к zapimir обратиться - он автор статьи