Двумя операциями, которые являются фундаментальными для двоичных систем, являются ИЛИ и И.
ИЛИ означает «если А включен или В включен». Примером из реальной жизни могут быть два переключателя параллельно. Если какой-либо из них пропускает ток, ток проходит через него.
И означает «если включены и А, и В». Пример реального мира - два переключателя в серии. Ток будет проходить, только если оба позволяют току.
В компьютере это не физические переключатели, а полупроводники, и их функциональность называется логическими элементами . Они выполняют те же действия, что и переключатели, - реагируют на ток или нет.
При применении к целым числам каждый бит в одном числе объединяется с каждым битом в другом числе. Таким образом, чтобы понять побитовые операторы OR и AND, вам необходимо преобразовать числа в двоичные, а затем выполнить операцию OR или AND для каждой пары совпадающих битов.
Вот почему:
00011011 (odd number)
AND
00000001 (& 1)
==
00000001 (results in 1)
Принимая во внимание
00011010 (even number)
AND
00000001 (& 1)
==
00000000 (results in 0)
Поэтому операция (& 1) сравнивает самый правый бит с 1, используя логику AND. Все остальные биты фактически игнорируются, потому что ничто и ничто не есть ничто. Четное число в двоичном виде также является четным числом в десятичной записи (10 кратно 2).
Другие фундаментальные операции с двоичными системами включают NOT и XOR. NOT означает «если A выключен» и является единственной формой логического элемента, который принимает только один сигнал или «параметр» вместо двух. XOR означает «включен ли A или B, но не оба». И затем есть NAND, NOR и NXOR, которые в основном просто НЕ объединяются с AND, OR и XOR, то есть NAND означает «если A и B не оба включены».
В программировании оператор
& means AND,
| means OR,
~ means NOT, and
^ means XOR.
Остальные можно составить, комбинируя их, например:
~ (a & b) is equivalent to a NAND operation
Примечание по PHP
Битовые операторы не работают со значениями с плавающей запятой, и в PHP значения с плавающей запятой сначала будут неявно преобразованы в целые числа. Числа вне диапазона, которые могут быть выражены в виде целых чисел, будут обрезаны до нуля, то есть все числа в PHP_INT_MAX будут выглядеть «четными» в выражении ($num & 1)
). Если вы хотите поддерживать числа за пределами PHP_INT_MIN / PHP_INT_MAX, вам потребуется fmod($num, 2)
. Однако, если вы используете 64-битный PHP, ваши целые числа будут иметь большую точность, чем числа с плавающей запятой.