2013-06-18 25 views
4

我一直使用,以便找到偶數和奇數如下:單雙號(使用&或%)

if( $num % 2 ) { echo "odd"; } 
if(!($num % 2)) { echo "even"; } 

但最近我用下面的代碼,工程完全一樣的偶然發現:

if( $num & 1 ) { echo "odd"; } 
if(!($num & 1)) { echo "even; } 

第二種方法中「&」背後的邏輯是什麼?

我去檢查PHP: Arithmetic Operators和符號是不是選項的一部分。

謝謝。

+0

這是[位與(http://us2.php.net/manual/en/language.operators.bitwise.php)運算符。 –

+0

你只是幾個部分:http://www.php.net/manual/en/language.operators.bitwise.php - 這是一個按位運算符,不是數學運算符。 – andrewsi

回答

10

這是bitwise-AND操作。請記住,在計算機中,每個整數被存儲在二進制形式,最低顯着性的二進制數字是2​​^0 == 1。因此,每一個奇數將具有最低二進制數字= 1

因此,按位AND運算符將您的值逐位與常數1進行比較。在兩個操作數中,1的位在結果中都設置爲1,但在操作數中爲0的位在結果中設置爲0。最終的結果(這將要麼10)被強制,因爲你是用它作爲在if()語句中的條款通過PHP爲布爾值。

有一個很好的理由來檢查與&而不是%:速度! %運算符需要一個除法運算,因此可以計算餘數,這在計算上要比直接比較比特要昂貴得多。

一個例子:

$num = 9;    // 9 == 8 + 1 == 2^3 + 2^0 == 1001b 
echo (string)($num & 1); // 1001b & 0001b = 0001b - prints '1' 

$num = 10;    // 10 == 8 + 2 == 2^3 + 2^1 == 1010b 
echo (string)($num & 1); // 1010b & 0001b = 0000b - prints '0' 
+0

我實際上會問哪個選項是最好的(資源方面),很好的答案。 – EOZyo

6

&是二進制AND

奇數的二進制值AND 1將是1,且偶數個與二進制值1將是0

這是因爲奇數的二進制值總是與1並結束偶數的二進制值0。因此,在偶數的情況下,結束在...的奇數個的情況下

10101101 & 00000001 = 00000001和,

10101100 & 00000000 = 00000000