PHP побитовые операторы
Побитовые операторы выполняют низкоуровневые манипуляции с битами в двоичных представлениях чисел. Эти операторы редко используются в программировании на PHP, поэтому если вы не знакомы с двоичным представлением целых чисел, то можете пропустить этот раздел. Побитовые операторы выполняют поразрядные операции булевой алгебры над отдельными битами операндов.
В наличии PHP есть 6 побитовых операторов:
Побитовое И (&)
Оператор &
выполняет операцию логическое И над каждым битом своих операндов. Бит результата устанавливается, если соответствующий бит установлен в обоих операндах.
Пример работы оператора «Побитовое И»:
Тоже самое только на примере PHP:
<?php $x = 3; // ...0011 $y = 5; // ...0101 echo $x & $y; // ...0001 (1) ?>
Побитовое ИЛИ (|)
Оператор |
выполняет операцию логическое ИЛИ над каждым битом своих операндов. Бит результата устанавливается, если соответствующий бит установлен хотя бы в одном операнде.
Пример работы оператора «Побитовое И»:
Тоже самое только на примере PHP:
<?php $x = 3; // ...0011 $y = 5; // ...0101 echo $x | $y; // ...0111 (7) ?>
Исключающее ИЛИ (^)
Оператор ^
выполняет операцию исключающее ИЛИ над каждым битом своих операндов. Бит результата устанавливается, если соответствующий бит установлен в одном (но не в обоих) из двух операндов.
Пример работы оператора «Исключающее ИЛИ»:
Искл. ИЛИ | 0011 |
0101 | |
0110 |
Тоже самое только на примере PHP:
<?php $x = 3; // ...0011 $y = 5; // ...0101 echo $x ^ $y; // ...0110 (6) ?>
Побитовое НЕ (~)
Оператор ~
(побитовое НЕ) представляет собой унарный оператор, указываемый перед своим единственным операндом. Он выполняет инверсию всех битов операнда. Из-за способа представления целых со знаком в PHP применение оператора ~
к значению эквивалентно изменению его знака и вычитанию 1.
Пример работы оператора «Побитовое НЕ»:
Тоже самое только на примере PHP:
<?php $y = 5; // ...0101 echo ~$y; // ...1010 (-6) ?>
Осталось рассмотреть два оператора — сдвиг влево и сдвиг вправо. Эти операторы можно использовать для быстрого умножения и деления (каждая позиция подразумевает «умножение/деление на 2»).
Сдвиг влево (<<)
Оператор <<
сдвигает все биты в первом операнде влево на количество позиций, указанное во втором операнде, который должен быть целым числом. Сдвиг значения влево на одну позицию эквивалентен умножению на 2, на две позиции — умножению на 4 и т.д.
Пример работы оператора «Сдвиг влево»:
<?php $y = 5; // 000000101 // тоже самое что и 5 * 4 echo $y << 2; // 000010100 (20) ?>
Сдвиг вправо (>>)
Оператор >>
сдвигает все биты в первом операнде вправо на количество позиций, указанное во втором операнде, который должен быть целым числом. Сдвиг значения вправо на одну позицию эквивалентен делению на 2, на две позиции — делению на 4 и т.д.
Пример работы оператора «Сдвиг вправо»:
<?php $y = 20; // 000010100 // тоже самое что и 20 / 4 echo $y >> 2; // 000000101 (5) ?>
Помимо описанных операторов, в PHP также предусмотрены и сокращенные формы записи побитовых операторов.
Оператор | Описание | Пример | Сокращенная форма записи |
---|---|---|---|
&= | Присваивает левому операнду результат работы Побитового И | $x = $x & $y | $x &= $y |
|= | Присваивает левому операнду результат работы Побитового ИЛИ | $x = $x | $y | $x |= $y |
^= | Присваивает левому операнду результат работы Исключающего ИЛИ | $x = $x ^ $y | $x ^= $y |
>>= | Присваивает левому операнду результат работы оператора Сдвига вправо | $x = $x >> 6 | $x >>= 6 |
<<= | Присваивает левому операнду результат работы оператора Сдвига влево | $x = $x << 6 | $x <<= 6 |
С этой темой смотрят:
puzzleweb.ru
PHP: Побитовые операторы | PHP
Битовые операторы позволяют работать с поразрядным представлением аргументов.
Оператор | Имя | Пример | Результат |
& | And | $x & $y | Задаются биты, которые установлены и в $x, и в $y. |
| | Or | $x | $y | Задаются биты, которые установлены или в $x, или в $y. |
^ | Xor | $x ^ $y | Задаются биты, которые установлены в $x или в $y, но не в обоих сразу. |
~ | Not | ~$x | Биты, которые установлены в $x, не задаются. И наоборот. |
<< | Shift left | $x << $y | Смещение битов $x на $y шагов влево.# |
>> | Shift right | $x >> $y | Смещение битов $x на $y шагов вправо.* |
# Каждый шаг означает «умножить на два».
* Каждый шаг означает «поделить на два».
В PHP битовых операциях бит (двоичный разряд) — это базовая единица информации, хранящаяся в вычислительной системе, которая существует в двух возможных состояниях, представленных как ON или OFF. В компьютерной системе состояние ON рассматривается как состояние 1, а OFF — 0. Эти состояния можно сравнить с двумя состояниями электрического переключателя (ВКЛ и ВЫКЛ) и т.п.
Значения задаются в двоичной системе исчисления. В десятичной системе построение числа основано на 10. Давайте посмотрим, как можно построить десятичное число —
231 = (2 ; 102 ) + (3 ; 101) + (1 ; 100)
= 200 + 30 + 1
= 231
Система двоичных чисел следует той же концепции. Единственное отличие состоит в том, что база равна 2, а не 10. Посмотрим, как двоичное число преобразовать в десятичное —
1011010=(1 x 26)+(0 x 25)+(1 x 24)+(1 x 23)+(0 x 22)+(1 x 21)+(0 x 20)
=(1 x 64) +(0 x 32)+(1 x 16)+(1 x 8)+(0 x 4)+(1 x 2)+(0 x 1)
=64+0+16+8+0+2+0
=90
Таким образом, (1011010)2= (90)10
Байт состоит из последовательности битов. Байт состоит из восьми битов. Максимальное значение байта составляет 255. Таким образом устанавливается значение места каждого бита.
1 байт (8 бит) | ||||||||
8-ой | 7-ой | 6-ой | 5-ый | 4-ый | 3-ий | 2-ой | 1-ый | |
Установленное значение | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
Табличное представление байта, демонстрирующее, как максимальное значение байта в битовой операции с числами составляет 255:
1 байт (8 бит) | ||||||||||
Установленное значение | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |||
27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | |||
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | = | 255 |
Десятичное число 93 может быть представлено в двоичной форме:
1 байт (8 бит) | ||||||||||
Установленное значение | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | |||
27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | |||
0 | 64 | 0 | 16 | 8 | 4 | 0 | 1 | = | 93 |
<?php $x=13; $y=22; echo $x & $y; ?>
Результат примера:
4
Пояснение
Опираясь на приведенные выше таблицы битовых операций, можно сказать, что единственный общий бит находится на третьей позиции с установленным значением 4. Таким образом, $x & $y = 4:
1 байт (8 бит) | ||||||||||
Установленное значение | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
$x | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | = | 13 |
$y | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | = | 22 |
В приведенной выше таблице для $x (13) установлено значение на первой, третьей и четвертой позиции. Значения позиции равны 1, 4 и 8. А для $y (22) значение установлено на второй, третьей и пятой позициях с соответствующими значениями: 2, 4 и 16.
Единственный бит, который является общим для $x и $y — это третий. Поэтому возвращается 4.
Рассмотрим другой пример оператора &, в котором больше бит.
<?php $x=77; $y=198; echo $x & $y; ?>
Результат примера PHP битовой операции:
68
Пояснение
1 байт (8 бит) | ||||||||||
Place Value | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
$x | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | = | 77 |
$y | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | = | 198 |
В приведенной выше таблице значение установлено для $x (77) на первой, третьей, четвертой и седьмой позиции. Значения позиций равны 1, 4, 8 и 64. Значение для $y (198) установлено на второй, третьей, седьмой и восьмой позициях с соответствующими значениями: 2, 4, 64 и 128.
Из приведенной выше таблицы видно, что общие для $x и $y — это третий и седьмой биты. Таким образом, возвращается 64 + 4 = 68.
Пример побитового оператора PHP OR:
<?php $x=5; $y=11; echo $x | $y; ?>
Результат примера:
15
Пояснение
1 байт (8 бит) | ||||||||||
Place Value | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | = | 5 | |
$y | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | = | 11 |
В приведенной выше таблице битовой операции с числами для $x (5) значение установлено на первой и третьей позициях. Значения позиций соответственно равны 1 и 4. Для $y (11) значения установлены на первой, второй и четвертой позициях с соответствующим значением: 1, 2 и 8.
Для $x и $y общими являются первый, второй, третий или четвертый бит. Возвращаемое значение представляет собой добавление значений позиций битов, то есть: 8 + 4 + 2 + 1 = 15.
Оператор Xor также выполняет побитовое сравнение двух числовых выражений и в результате устанавливает общий бит. Когда одно и только одно выражение является истинным, тогда он возвращает true.
В приведенной ниже таблице показано, как выполняется операция XOR:
Выражение 1 | Выражение 2 | Результат |
False | False | False |
False | True | True |
True | False | True |
True | True | False |
В приведенной ниже таблице показано побитовое сравнение оператора XOR:
Бит в Выражении 1 | Бит в Выражении 2 | Результат |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 |
<?php $x=12; $y=11; echo $x ^ $y; ?>
Результат примера PHP битовой операции:
7
Пояснение
1 байт (8 бит) | ||||||||||
Значение позиции | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
$x | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | = | 12 |
$y | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | = | 11 |
В приведенной выше таблице для $x (12) установлено значение на третьей и четвертой позиции. Значения позиции равны 4 и 8. А для $y (11) значение задано на первой, второй и четвертой позиции с соответствующими значениями: 1, 2 и 8.
$ x и $ y устанавливают вместе первый, второй, третий или четвертый бит. Но вместе они используют только 4-й бит. Поэтому возвращаемое значение представляет собой добавление места для них. Но не совместно используемый бит: 4 + 2 + 1 = 7.
В приведенной ниже таблице будет показано, как оператор NOT выполняет операции с $x и $y и возвращает true, когда заданный в одном выражении бит не задан в другом выражении.
<?php $x=12; $y=10; echo $x & ~ $y; ?>
Результат примера:
4
Пояснение
1 байт (8 бит) | ||||||||||
Значение позиции | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
$x | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | = | 12 |
$y | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | = | 10 |
В приведенной выше таблице для $x (12) значение установлено на третьей и четвертой позициях. Значения позиции равны 4 и 8. Для $y (10) значение установлено на второй и четвертой позициях с соответствующими значениями 2 и 8.
Для $x и $y заданы биты на первой, второй, третьей и четвертой позициям, но общий для них только четвертый бит. Возвращаемое значение равно 4, так как это единственное значение, заданное для $x, но не заданное для $y.
<?php $x=12; $y=10; echo ~ $x & $y; ?>
Результат примера:
2
Пояснение
В этом случае возвращаемое значение равно 2, потому что бит установлен для $y, но не установлен для $x.
Если a и b — это два числа. Оператор сдвига перемещает бит b на определенное количество позиций. Каждый шаг означает умножение на два (сдвиг влево). Если это сдвиг вправо, тогда каждый шаг означает деление на два.
<?php $x=8; $y=3; echo $x << $y; ?>
Результат примера битовой операции
64
Пояснение
1 байт (8 бит) | ||||||||||
Значение позиции | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
$x | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | = | 8 |
Результат | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | = | 64 |
В приведенном выше примере берется значение $x, которое равно 8, и выполняется операция сдвига влево: 8 умножается на 2 три раза. Таким образом, мы получаем 8 x 2 x 2 x 2 = 64.
<?php $x=12; $y=4; echo $x << $y; ?>
Результат примера:
192
Пояснение
В приведенном выше примере берется значение $x, равное 12, и выполняется операция сдвига влево: умножается на 2 четыре раза. Таким образом, мы получаем 12 x 2 x 2 x 2 x 2 = 192.
1 байт (8 бит) | ||||||||||
Значение позиции | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
$x | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | = | 12 |
Результат | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | = | 192 |
<?php $x=8; $y=3; echo $x >> $y; ?>
Результат примера битовой операции с числами:
1
Пояснение
1 байт (8 бит) | ||||||||||
Значение позиции | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
$x | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | = | 8 |
Результат | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | = | 1 |
В приведенном выше примере берется значение $x, которое равно 8, и выполняется операция сдвига вправо: 8 делится на 2 три раза. Таким образом, получаем 8/2 = 4/2 = 2/2 = 1.
<?php $x=96; $y=5; echo $x >> $y; ?>
Результат примера:
3
Пояснение
1 байт (8 бит) | ||||||||||
Значение позиции | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
$x | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | = | 96 |
Результат | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | = | 3 |
В приведенном выше примере берется значение $x, равное 96, и выполняется операция сдвига вправо: 96 делится на 2 пять раз. Таким образом, мы получаем 96/2 = 48/2 = 24/2 = 12/2 = 6/2 = 3.
<?php $x=64; $y=7; echo $x >> $y; ?>
Результат примера PHP битовой операции:
0
Пояснение
1 байт (8 бит) | ||||||||||
Значение позиции | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
$x | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | = | 64 |
Результат | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | = | 0 |
В приведенном выше примере берется значение $x, равное 64, и выполняется операция сдвига вправо: 64 делится на 2 семь раз. При делении в определенный момент нам нечего делить. Таким образом, результат равен 0.
Данная публикация представляет собой перевод статьи «PHP Bitwise operator» , подготовленной дружной командой проекта Интернет-технологии.ру
www.internet-technologies.ru
Побитовые операторы в PHP
Побитовые операторы в PHP
Категория: Операторы / Автор: Артём
Что такое побитовые операторы?
Побитовые операторы — арифметическая операция, которая отвечает за побитовый сдвиг в PHP.
Биты, сдвинутые за границы числа, отбрасываются. Сдвиг влево дополняет число нулями справа, сдвигая в то же время знаковый бит числа влево, что означает что знак операнда не сохраняется. Сдвиг вправо сохраняет копию сдвинутого знакового бита слева, что означает что знак операнда сохраняется.
Для чего нужны побитовые операторы?
Побитовые операторы в PHP позволяют считывать и устанавливать конкретные биты целых чисел.
Синтаксис побитовых операторов
Синтаксис всех побитовых операторов представлен в таблице ниже.
Пример | Название | Результат |
$a & $b | И | Устанавливаются только те биты, которые установлены и в $a, и в $b. |
$a | $b | Или | Устанавливаются те биты, которые установлены в $a или в $b. |
$a ^ $b | Исключающее или | Устанавливаются только те биты, которые установлены либо только в $a, либо только в $b, но не в обоих одновременно. |
~ $a | Отрицание | Устанавливаются те биты, которые не установлены в $a, и наоборот. |
$a << $b | Сдвиг влево | Все биты переменной $a сдвигаются на $b позиций влево (каждая позиция подразумевает — умножение на 2) |
$a >> $b | Сдвиг вправо | Все биты переменной $a сдвигаются на $b позиций вправо (каждая позиция подразумевает — деление на 2) |
Важные моменты
Используйте скобки для обеспечения необходимого приоритета операторов. Например, $a & $b == true сначала проверяет на равенство, а потом выполняет побитовое и; тогда как ($a & $b) == true сначала выполняет побитовое и, а потом выполняет проверку на равенство.
Если оба операнда для &, | и ^ являются строками, то операция будет выполнена над ASCII значениями символов, составляющих эти строки, и результатом будет строка. В других случаях, оба операнда будут приведены к целому и результатом будет тоже целое число.
Если операнд для оператора ~ является строкой, то операция будет произведена над ASCII значением символов, составляющих эту строку, и результатом будет строка. Иначе, и операнд и результат будут оперироваться как целые числа.
Теги: PHP, Операторы.
artemsannikov.ru
как использовать побитовые операции MySQL в php? — php
Хотя на вопрос о том, как выполнять побитовые операции в MySQL, был дан ответ, вопрос в комментариях о том, почему эта модель не может быть оптимальной, остается невыясненной.
В приведенном примере есть две таблицы; один с битовой маской и один с разбиением того, что каждый бит представляет. Подразумевается, что в какой-то момент две таблицы должны быть объединены вместе, чтобы возвращать/отображать значение различных бит.
Это соединение будет либо явным, например.
SELECT *
FROM Table1
INNER JOIN TABLE2
ON table1.ptid & table2.id <> 0
Или неявный, где вы можете выбрать данные из table1
в ваше приложение, а затем сделать второй вызов для поиска значений битовой маски, например.
SELECT *
FROM table2
WHERE id & $id <> 0
Ни один из этих вариантов не является идеей, потому что они не являются «недоступными», то есть база данных не может построить поисковый ARGument. В результате вы не можете оптимизировать запрос с помощью индекса. Стоимость запроса выходит за рамки невозможности использовать индекс, поскольку для каждой строки в таблице БД должна вычислять и оценивать выражение. Это очень быстро происходит с интенсивностью памяти, процессора и ввода-вывода, и его невозможно оптимизировать без принципиального изменения структуры таблицы.
Помимо полной неспособности оптимизировать запрос, также может быть неудобно читать данные, сообщать о данных, а также потенциально запускать ограничения, добавляя больше битов (64 значения в 8-разрядном столбце могут быть точными сейчас, но не всегда всегда так. Они также затрудняют понимание систем, и я бы сказал, что этот проект нарушает первую нормальную форму.
Хотя использование битмаски в базе данных часто является признаком плохого дизайна, бывают случаи, когда их использовать можно. Реализация отношений «многие-ко-многим» действительно не относится к тем временам.
Типичный подход к реализации такого типа отношений выглядит примерно так:
table1
Id Val1 Val2
---------------------------
1 ABC DEF
2 ABC DEF
3 ABC DEF
4 ABC DEF
5 ABC DEF
6 ABC DEF
table2
id types
-------------
1 music
2 art
3 pictures
4 video
5 art2
6 actor
7 movies
table1-table2-relationshitp
table1ID Table2ID
---------------------
1 1
1 2
2 3
2 5
3 2
3 7
...
И вы запросите данные таким образом
SELECT table1.*, table2.types
FROM table1
INNER JOIN table1-table2-relationship
ON table1.id = table1-table2-relationship.table1id
INNER JOIN table2
ON table1-table2-relationship.table2.id = table2.id
В зависимости от шаблона доступа этих таблиц вы обычно индексируете оба столбца в таблице отношений как составной индекс (обычно я рассматриваю их как составной первичный ключ.) Этот индекс позволит базе данных быстро искать соответствующие строки в таблице отношений, а затем искать соответствующие строки в таблице2.
qaru.site
Операции в PHP
Операции в PHP
Последнее обновление: 1.11.2015
В PHP мы можем использовать различные операторы: арифметические, логические и т.д. Рассмотрим каждый тип операций.
Арифметические операции
+ (операция сложения)
Например,$a + 5
— (операция вычитания)
Например,$a - 5
* (умножение)
Например,$a * 5
/ (деление)
Например,$a / 5
% (получение остатка от деления)
Например:$a=12; echo $a % 5; // равно 2
++ (инкремент/ увеличение значения на единицу)
Например,++$a
Важно понимать разницу между выражениями
++$a
и$a++
. Например:$a=12; $b=++$a; // $b равно 13 echo $b;
Здесь сначала к значению переменной $a прибавляется единица, а затем ее значение приравнивается переменной $b. Иначе было бы, если бы выражение выглядело так:
$b=$a++;
. Здесь сначала значение переменной $a приравнивалось переменной $b, а затем происходило увеличение значения переменной $a.— (декремент/ уменьшение значения на единицу)
Например,--$a
. И также, как и в случае с инкрементом, существуют два вида записи:--$a
и$a--
Операции присваивания
=
Приравнивает переменной определенное значение:$a = 5
+=
Сложение с последующим присвоением результата. Например:$a=12; $a += 5; echo $a; // равно 17
-=
Вычитание с последующим присвоением результата. Например:$a=12; $a -= 5; echo $a; // равно 7
*=
Умножение с последующим присвоением результата:$a=12; $a *= 5; echo $a; // равно 60
/=
Деление с последующим присвоением результата:$a=12; $a /= 5; echo $a; // равно 2.4
.=
Объединение строк с присвоением результата. Применяется к двум строкам. Если же переменные хранят не строки, а, к примеру, числа, то их значения преобразуются в строки и затем проводится операция:$a=12; $a .= 5; echo $a; // равно 125 // идентично $b="12"; $b .="5"; // равно 125
%=
Получение остатка от деления с последующим присвоением результата:$a=12; $a %= 5; echo $a; // равно 2
Операции сравнения
Операции сравнения, как правило, применяются в условных конструкциях, когда надо сравнивать два значения, и в зависимости от результата сравнения выполнить некоторые действия. Имеются следующие операции сравнения.
==
Оператор равенства сравнивает два значения, и если они равны, возвращает true, иначе возвращает false:$a == 5
===
Оператор тождественности также сравнивает два значения, и если они равны, возвращает true, иначе возвращает false:$a === 5
!=
Сравнивает два значения, и если они не равны, возвращает true, иначе возвращает false:$a != 5
!==
Сравнивает два значения, и если они не равны, возвращает true, иначе возвращает false:$a !== 5
>
Сравнивает два значения, и если первое больше второго, то возвращает true, иначе возвращает false:$a > 5
<
Сравнивает два значения, и если первое меньше второго, то возвращает true, иначе возвращает false:$a < 5
>=
Сравнивает два значения, и если первое больше или равно второму, то возвращает true, иначе возвращает false:$a >= 5
<=
Сравнивает два значения, и если первое меньше или равно второму, то возвращает true, иначе возвращает false:$a <= 5
Оператор равенства и тождественности
Оба оператора сравнивают два выражения и возвращают true, если выражения равны. Но между ними есть различия. Если в операции равенства принимают два значения разных типов, то они приводятся к одному — тому, который интерпретатор найдет оптимальным. Например:
<?php $a = "22a"; $b = 22; if($a==$b) echo "равны"; else echo "не равны"; ?>
Очевидно, что переменные хранят разные значения разных типов. Но при сравнении они будут приводится к одному типу — числовому. И переменная $a будет приведена к числу 22. И в итоге обе переменных окажутся равны.
Или, например, следующие переменные также будут равны:
$a = false; $b = 0;
Чтобы избежать подобных ситуаций используется операция эквивалентности, которая учитывает не только значение, но и тип переменной:
$a = "22a"; $b = 22; if($a===$b) echo "равны"; else echo "не равны";
Теперь переменные будут не равны.
Аналогично работают операторы неравенства !=
и !==
.
Логические операции
Логические операции обычно применяются для объединения результатов двух операций сравнения. Например, нам надо выполнить определенное действие, если истинны будут несколько условий. Имеются следующие логические операции:
&&
Возвращает true, если обе операции сравнения возвращают true, иначе возвращает false:$a == 5 && $b = 6
and
Аналогично операции&&
:$a == 5 and $b > 6
||
Возвращает true, если хотя бы одна операция сравнения возвращают true, иначе возвращает false:$a == 5 || $b = 6
or
Аналогично операции||
:$a < 5 or $b > 6
!
Возвращает true, если операция сравнения возвращает false:!($a >= 5)
xor
Возвращает true, если только одно из значений равно true. Если оба равны true или ни одно из них не равно true, возвращает false. Например:$a=12; $b=6; if($a xor $b) echo 'true'; else echo 'false';
Здесь результат логической операции будет
false
, так как обе переменных имеют определенное значение. Изменим код:$a=12; $b=NULL; if($a xor $b) echo 'true'; else echo 'false';
Здесь уже результат будет
true
, так как значение одной переменной не установлено. Если переменная имеет значение NULL, то в логических операциях ее значение будет рассматриваться какfalse
Битовые операции
Битовые операции производятся над отдельными битами числа. Числа рассматриваются в двоичном представлении, например, 2 в двоичном представлении 010, число 7 — 111.
& (логическое умножение)
Умножение производится поразрядно, и если у обоих операндов значения разрядов равно 1, то операция возвращает 1, иначе возвращается число 0. Например:$a1 = 4; //100 $b1 = 5; //101 echo $a1 & $b1; // равно 4
Здесь число 4 в двоичной системе равно 100, а число 5 равно 101. Поразрядно умножим числа и получим (1*1, 0*0, 0 *1) = 100, то есть число 4 в десятичном формате.
| (логическое сложение)
Похоже на логическое умножение, операция также производится по двоичным разрядам, но теперь возвращается единица, если хотя бы у одного числа в данном разряде имеется единица. Например: $a1 = 4; //100 $b1 = 5; //101 echo $a1 | $b1; // равно 5~ (логическое отрицание)
инвертирует все разряды: если значение разряда равно 1, то оно становится равным нулю, и наоборот.$b = 5; echo ~$b;
<<
x<<y — сдвигает число x влево на y разрядов. Например, 4<<1 сдвигает число 4 (которое в двоичном представлении 100) на один разряд влево, то есть в итоге получается 1000 или число 8 в десятичном представлении
>>
x>>y — сдвигает число x вправо на y разрядов. Например, 16>>1 сдвигает число 16 (которое в двоичном представлении 10000) на один разряд вправо, то есть в итоге получается 1000 или число 8 в десятичном представлении
Объединение строк
Для объединения строк используется оператор «точка». Например, соединим несколько строк:
$a="Привет, "; $b=" мир"; echo $a . $b . "!";
Если переменные представляют не строки, а другие типы, например, числа, то их значения преобразуются в строки и затем также происходит операция объединения строк.
metanit.com