Рассмотрим поразрядные операции в 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 цветов для сайта