Поразрядные операции в PHP

Рассмотрим поразрядные операции в PHP. Эти операции встречаются не часто, но зачастую их удобно использовать. В таблице ниже приведены поразрядные операции.

Оператор Описание
& Поразрядное “И” (логическое AND)
| Поразрядное “ИЛИ” (логическое OR)
^ Поразрядное исключающее “ИЛИ” (сложение по модулю 2 “XOR”)
~ Поразрядное инвертирование (NOT)
<< Поразрядный сдвиг влево на количество указанное после оператора
>> Поразрядный сдвиг вправо на количество указанное после оператора

Чтобы понять как работают поразрядные операции, нужно уметь работать с двоичной системой счисления. Я постараюсь вкратце изложить необходимые знания для того, чтобы Вы смогли усвоить тему.

Помимо десятичной системы счисления (к которой все привыкли), существует ещё и двоичная система счисления, где числа состоят только из 0 и 1. Все данные в вычислительных устройствах хранятся в двоичной системе счисления. Я не буду в подробностях описывать перевод из десятичной системы в двоичную и обратно, поскольку это отдельная тема. Рассмотрим маленький пример, чтобы Вы примерно понимали как это происходит: допустим нам надо перевести число 10112 в десятичную систему счисления: 10112 = (1×23 + 0×22 + 1×21 + 1×20)10 = 1110.

Рассматриваемые поразрядные операции работают с двоичными числами. Теперь рассмотрим в отдельности каждый из операторов.

1. Поразрядное “И”

Допустим у нас есть два двоичных числа: 010112 и 011012. Применим операцию поразрядного “И”: 010112 & 011012 = 010012.

Правило: Каждый разряд сравнивается с таким же разрядом другого числа. В случае если оба разряда равны 1, то и результатом будет 1, иначе если есть хотя бы один 0, то в ответ будет 0. Рассмотрим пример поразрядного “И” на PHP:

<?php
//Присваиваем переменным значения:
$num1 = 10; //в двоичном коде число 10 равно 1010
$num2 = 7; //в двоичном коде число 7 равно 0111
echo "$num1 & $num2 = ". ($num1 & $num2); //получим 2 (00102)
//Можно было написать и так:
echo "<br/>10 & 7 = ". (10 & 7);
?>

Результатом выше описанного примера будет число 2, поскольку после применения поразрядного “И” к числам 1010 и 0111 в результате мы получим число 0010 в двоичном коде, а при переводе в десятичную систему получим число 2.





2. Поразрядное “ИЛИ”

Поразрядное “ИЛИ” очень похоже на поразрядное “И”. В данном случае правило следующее: если при поразрядном сравнение есть хотя бы одна 1, то результат будет 1. Если оба числа 0, то результат будет 0. Например: 010112 | 011012 = 011112. Рассмотрим пример поразрядного “ИЛИ” на PHP:

<?php
//Присваиваем переменным значения:
$num1 = 10; //в двоичном коде число 10 равно 1010
$num2 = 7; //в двоичном коде число 7 равно 0111
echo "$num1 | $num2 = ". ($num1 | $num2); //получим 15 (11112)
//Можно было написать и так:
echo "<br/>10 | 7 = ". (10 | 7);
?>

При поразрядном сравнении двоичных чисел 1010 и 0111 мы получим двоичное число 1111, которое при переводе в десятичную систему счисления даст 15.

3. Поразрядное исключающее “ИЛИ”

Эту операцию также называют сложением по модулю 2. Опять нужно сравнивать все числа поразрядно, соблюдая следующее правило: если при сравнении получается две 1 или два 0, то в результате будет 0, иначе будет 1. Например, 010112 ^ 011012 = 001102. Рассмотрим пример поразрядного исключающего “ИЛИ” на PHP:

<?php
//Присваиваем переменным значения:
$num1 = 10; //в двоичном коде число 10 равно 1010
$num2 = 7; //в двоичном коде число 7 равно 0111
echo "$num1 ^ $num2 = ". ($num1 ^ $num2); //получим 13 (11012)
//Можно было написать и так:
echo "<br/>10 ^ 7 = ". (10 ^ 7);
?>

4. Поразрядное инвертирование (NOT)

У операции NOT очень простое правило: если был 0, то будет 1 и наоборот, то есть происходит самое обыкновенное инвертирование. Например, ~0110102 = 1001022. Рассмотрим пример поразрядного инвертирования на PHP:

<?php
//Присваиваем переменным значения:
$num1 = 10;
echo "~$num1 = ". ~$num1 ; //получим -11
//Можно было написать и так:
echo "<br/>~10 = ". ~10;
?>

~10 = -11. Этот результат можно объяснить тем, что в двоичном коде число 10 представляется так: 00000000 00000000 00000000 00001010 (поскольку в PHP на хранение одного числа выделяется 4 байта или 32 бита). После операции инвертирования получим: 11111111 11111111 11111111 11110101, что при переводе в десятичную систему дает число -11.

5. Поразрядный сдвиг влево (<<)

Трудно сформулировать правило для поразрядный сдвига влево (<<), поэтому лучше приведу простенький пример. Например, у нас есть число 10 (10102), применяя операцию сдвига влево (<<) на одну позицию мы получим следующее двоичное число: 101002, которое при переводе в десятичную систему даст 20. Приведем ещё пример: пусть есть число 14 (11102), сдвинем его влево на три позиции. В результате получим 11100002, что при переводе в десятичную систему счисления даст число 112. Рассмотрим пример поразрядного сдвига влево на PHP:

<?php
//Присваиваем переменным значения:
$num1 = 10;
echo "$num1 << 1 = ". ($num1 << 1); //получим 20 (101002)
//Можно было написать и так:
echo "<br/>10 << 1 = ". (10 << 1);
//Другой пример:
echo "<br/>14 << 3 = ". (14 << 3); //получим 112
echo "<br/>6 << 31 = ". (6 << 31); //получим 0 (т.е. все разряды ушли влево)
// и остались одни нули
?>

6. Поразрядный сдвиг вправо (>>)

Смысл операции поразрядного сдвига вправо такой же как и в предыдущем случае. Разница лишь в том, что разряды сдвигаются не влево, а вправо. Например, у нас есть число 10 (10102), применяя операцию сдвига вправо (<<) на одну позицию мы получим следующее двоичное число: 1012, что в десятичной системе счисления равно 5. Рассмотрим пример поразрядного сдвига вправо на PHP:

<?php
//Присваиваем переменным значения:
$num1 = 10;
echo "$num1 >> 1 = ". ($num1 >> 1); //получим 5 (1012)
//Можно было написать и так:
echo "<br/>10 >> 1 = ". (10 >> 1);
//Другой пример:
echo "<br/>100 >> 3 = ". (100 >> 3); //получим 12
?>

Следующий урок: Условный оператор if…else.




Читайте также:

• Переменные в php

• Использование методов GET и POST

• Типы данных в php

• Операции над числами в php

• Как добавить кнопку "Наверх" на сайте

• Как сделать форму обратной связи на php с каптчей

• Коды спецсимволов в HTML

• Коды и названия html цветов для сайта

← Перейти в каталог php уроков

Читайте также:

Copy Protected by Chetan's WP-Copyprotect.