Я прочитал PHP Manuel о array_filter
<?php function odd($var) { // returns whether the input integer is odd return($var & 1); } function even($var) { // returns whether the input integer is even return(!($var & 1)); } $array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5); $array2 = array(6, 7, 8, 9, 10, 11, 12); echo "Odd :\n"; print_r(array_filter($array1, "odd")); echo "Even:\n"; print_r(array_filter($array2, "even")); ?>
Даже я вижу результат здесь:
Odd : Array ( [a] => 1 [c] => 3 [e] => 5 ) Even: Array ( [0] => 6 [2] => 8 [4] => 10 [6] => 12 )
Но я не понял эту строку: return($var & 1);
Может ли кто-нибудь объяснить мне об этом?
$var & 1
– побитовое И проверяет, является ли $var
значением ODD
0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1
поэтому первая функция обратного вызова возвращает TRUE только в том случае, если $ var является ODD, а second – vise versa (! – является логическим NOT).
Вы знаете, что &&
есть AND
, но то, что вы, вероятно, не знаете, является &
is bit-wise AND
.
Оператор &
работает на уровне бит, он поразмерно. Вам нужно думать в терминах двоичных представлений операндов.
например
7 10 & 2 10 = 111 2 & 010 2 = 010 2 = 2 10
Например, выражение $var & 1
используется для проверки того, является ли младший значащий бит 1
или 0
, нечетным или даже соответствующим образом.
$var & 1
0 10 & 1 10 = 000 2 & 001 2 = 000 2 = 0 10 = false (even)
1 10 & 1 10 = 001 2 & 001 2 = 001 2 = 1 10 = true (odd)
2 10 & 1 10 = 010 2 & 001 2 = 000 2 = 0 10 = false (even)
3 10 & 1 10 = 011 2 & 001 2 = 001 2 = 1 10 = true (odd)
4 10 & 2 10 = 100 2 & 001 2 = 000 2 = 0 10 = false (even)
and so on...
&
это побитовый оператор. Он выполняет AND с бит-ответчиком $var
и 1
В основном он проверяет последний бит $ var, чтобы увидеть, является ли число четным или нечетным
Пример с двоичным двоичным ключом $ var 000110 и 1
000110 & 1 ------ 0
0 (false) в этом случае возвращается, поэтому число равно, и ваша функция возвращает false соответственно
Он выполняет побитовое И с $ var и 1. Поскольку 1 имеет только последний бит, $var & 1
будет только true, если последний бит установлен в $ var. И так как четные числа никогда не имеют последнего установленного бита, если значение AND истинно, число должно быть нечетным.
&
является побитовым "и" оператором. С 1, 3, 5 (и другими нечетными номерами) $var & 1
приведет к «1», с 0, 2, 4 (и другими четными числами) – в «0».
Нечетное число имеет нулевой ( наименее значимый ) бит, установленный в 1
:
v 0 = 00000000b 1 = 00000001b 2 = 00000010b 3 = 00000011b ^
Выражение $var & 1
выполняет побитовое И- операцию между $ var и 1 ( 1 = 00000001b
). Таким образом, выражение вернется:
$var
имеет нулевой бит, установленный в 1 (нечетное число) $var
имеет нулевой бит, равный 0 (четное число) & является поразрядным И на $ var.
Если $ var является десятичным числом 4, это двоичный код 100. 100 & 1 равно 100, потому что самая правая цифра равна 0 в $ var – и 0 & 1 равна 0, и, следовательно, четность равна 4.
он возвращает 0 или 1, в зависимости от вашего $ var
если $ var – нечетное число, например. (1, 3, 5 …) он $ var & 1 возвращает 1, в противном случае (2, 4, 6) $ var & 1 возвращает 0