Главная » 2015 » Ноябрь » 21 » Урок 6. Поразрядные операции в PHP
21:43
Урок 6. Поразрядные операции в PHP

Поразрядные операции в 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. Поразрядный сдвиг влево ( Трудно сформулировать правило для поразрядный сдвига влево (2), применяя операцию сдвига влево (2, которое при переводе в десятичную систему даст 20. Приведем ещё пример: пусть есть число 14 (11102), сдвинем его влево на три позиции. В результате получим 11100002, что при переводе в десятичную систему счисления даст число 112. Рассмотрим пример поразрядного сдвига влево на PHP:

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

Категория: Все о сайтах | Просмотров: 369 |
Всего комментариев: 0
avatar