функция обратного вызова возвращает возврат ($var & 1)?


Я прочитал руководство по PHP о 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); Может ли кто-нибудь объяснить мне об этом?

Author: hakre, 2011-06-01

8 answers

$var & 1 - является побитовым И проверяет, является ли $var НЕЧЕТНЫМ значением

0 & 0 = 0,
0 & 1 = 0,
1 & 0 = 0,
1 & 1 = 1 

Таким образом, первая функция обратного вызова возвращает значение TRUE, только если $var НЕЧЕТНОЕ, а вторая - наоборот (! - логично, что НЕТ).

 2
Author: heximal, 2011-06-01 12:37:49

Вы знаете, что && - это AND, но вы, вероятно, не знаете, что & - это в битовом смысле AND.

Оператор & работает на битовом уровне, он является битовым. Вам нужно мыслить в терминах двоичных представлений операндов.

Например,

710 & 210 = 1112 & 0102 = 0102 = 210

Например, выражение $var & 1 используется для проверки того, является ли наименьший значащий бит 1 или 0 нечетным или четным соответственно.

$var & 1

010 & 110 = 0002 & 0012 = 0002 = 010 = false (even)

110 & 110 = 0012 & 0012 = 0012 = 110 = true  (odd)

210 & 110 = 0102 & 0012 = 0002 = 010 = false (even)

310 & 110 = 0112 & 0012 = 0012 = 110 = true  (odd)

410 & 210 = 1002 & 0012 = 0002 = 010 = false (even)

and so on...

 4
Author: Alexander, 2012-06-09 09:24:06
& 

Это побитовый оператор. Он выполняет И с соответствующим битом $var и 1

В основном он проверяет последний бит $var, чтобы увидеть, четное или нечетное число

Пример с двоичным кодом $var, равным 000110 и 1

000110 &
     1
------
     0

0 (false) в этом случае возвращается, поэтому число четное, и ваша функция соответственно возвращает false

 3
Author: dynamic, 2012-06-09 09:23:42

Он выполняется побитово И с $var и 1. Поскольку 1 имеет только последний бит, $var & 1 будет истинным, только если последний бит установлен в $var. И поскольку четные числа никогда не имеют последнего установленного бита, если И верно, то число должно быть нечетным.

 2
Author: tjm, 2011-06-01 12:31:58

& является побитовым оператором "и". С 1, 3, 5 (и другими нечетными числами) $var & 1 приведет к "1", с 0, 2, 4 (и другими четными числами) - к "0".

 1
Author: binaryLV, 2011-06-01 12:33:13

Нечетное число имеет свой нулевой (наименее значимый ) бит, равный 1:

           v
0 = 00000000b
1 = 00000001b
2 = 00000010b
3 = 00000011b
           ^

Выражение $var & 1 выполняет побитовую операцию И между $var и 1 (1 = 00000001b). Таким образом, выражение вернет:

  • 1, когда $var имеет нулевой бит, равный 1 (нечетное число)
  • 0, когда $var имеет нулевой бит, равный 0 (четное число)
 1
Author: Salman A, 2012-06-09 09:15:46

& является побитовым И на $var.

Если $var - десятичное число 4, это двоичное 100. 100 и 1 равно 100, потому что самая правая цифра - 0 в $var, а 0 и 1 равно 0, таким образом, 4 четно.

 0
Author: stefgosselin, 2011-06-01 12:42:45

Он возвращает 0 или 1, в зависимости от вашего $var

Если $var - нечетное число, например (1, 3, 5...), то $var &1 возвращает 1, в противном случае (2, 4, 6) $var &1 возвращает 0

 0
Author: StPiere, 2012-06-09 09:02:50