2011-06-01 198 views
2

我已阅读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);任何人都可以解释我这个?

回答

2

$var & 1 - 是位与 它会检查是否$var是奇数值

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

所以,第一个回调函数返回TRUE仅是$ var是奇数,二 - 反之亦然( - !是逻辑非) 。

+0

你是对的 - 我的错字) – heximal 2011-06-01 12:36:09

2

它与$ var和1执行按位与操作。由于1只有最后一位设置,所以$var & 1只有在最后一位设置在$ var时才为真。并且由于偶数从未设置最后一位,如果AND为真,则该数字必须是奇数。

1

&是按位“和”运算符。用1,3,5(和其他奇数)$var & 1将导致“1”,其中0,2,4(和其他偶数) - 在“0”中。

0

&是一个bitwise AND on $ var。

如果$ var是一个十进制数4,它是一个二进制数100. 100 & 1是100,因为最右边的数字在$ var中是0,并且0 & 1是0,因此4是偶数。

3
& 

它是按位运算符。它做的,用的$var的corrispondent位和1

基本上它测试$ VAR的最后一位,看看数字是偶数或$ VAR二进制为000110和1

000110 & 
    1 
------ 
    0 

0(假)在这种情况下返回,因此数量是偶数,和你的函数返回false相应

+0

我明白它是和。但是($ var x&1)如何确定是否奇数 – gilzero 2012-06-09 09:01:26

+0

它是AND,除了它作用于您单独比较的两个数字中的每一位(并返回一个int),而不是作用于这两个数字的逻辑AND作为一个整体(并返回一个布尔值)。 – Artefact2 2012-06-09 09:02:59

+0

没有意义:( – gilzero 2012-06-09 09:05:58

0

它返回0或1,这取决于你是$ var

如果$ var是奇数,例如。 (1,3,5 ...)它是$ var & 1返回1,否则(2,4,6)$变种& 1返回0

1

奇数个具有其第零(least significant)位设置为1

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

表达$var & 1执行$ var和1(1 = 00000001b)之间的bitwise AND操作。所以 表达将返回:

  • 1时$var有其第零比特设置为1(奇数)
  • 0时$var具有其第零比特设置为0(偶数)
+0

这不是三个:) – Alexander 2012-06-09 09:13:59

+0

哎呀...修正。 – 2012-06-09 09:16:12

4

你知道&&AND,但你可能不知道的是&是一个按位AND

&运营商在一个比特级别工作,它是按位。您需要考虑操作数的二进制表示形式。

例如

710 & 210 = 1112 & 0102 = 0102 = 210

例如,表达$var & 1用于测试,如果至少显著位为10,奇数或偶数分别。

$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...

+0

因此($ var&1)将$ var与数字1进行比较? – gilzero 2012-06-09 09:21:05

+0

是的,在一定程度上。 – Alexander 2012-06-09 09:26:25