2011-06-01 238 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