2016-06-20 95 views
-4
if((x & 1) == 0) 
    printf("EVEN!\n"); 
else 
    printf("ODD!\n"); 

爲什麼X&1總會給人1時數是奇數。我的意思是這個操作過程中發生內存可以在任何一個解釋嗎?關於位運算符

+0

什麼部分你不明白?你有沒有嘗試自己編寫二進制代碼和數字?維基百科也有[良好條目](https://en.wikipedia.org/wiki/Bitwise_operations_in_C)。 – Evert

+0

你在C書,任何在線教程,維基百科等中究竟有什麼不明白的地方? – Olaf

+0

'(x&1)'隔離最不重要的位。每個比特對應於2的冪,與十進制數的每個數字對應於十的冪相同 - 對於低位,奇數的唯一整數冪是2^0。其他位對奇數/偶數沒有影響,因爲無論您將多少個偶數加在一起,結果仍然是偶數......但是比任何偶數(加入2^0的相同數)多一個將是奇數。 – Dmitri

回答

0

二進制中的每個奇數都有設置的最低位。並且X & 1總是測試那個位。因此,檢查總是如此。

如果你不明白爲什麼第一條語句是真的,那麼只需將幾個十進制數轉換爲二進制數就可以了。

1 == 00000001b 
3 == 00000011b 
5 == 00000101b 
7 == 00000111b 
etc 

然後就可以肯定,做同樣的幾連號以驗證最低位始終爲0:

2 == 00000010b 
4 == 00000100b 
6 == 00000110b 
8 == 00001000b 
etc 
0

這是因爲二進制數。每個二進制數是2到某個數的冪的集合。如果你正在尋找4位數,那麼只有奇數是1(2的冪0)。如果您正在尋找例如12號它是二進制表示1100。當你把1面具,它看起來像這樣

1100 
    &0001 
    0000 

如果你選擇一個奇數,例如3,你有 0011 &0001 0001 作爲你只能看到二進制數的最後一個數字是奇數,1是00000001

0

無論什麼sizeof(int)在一個平臺上,通過設置0除了至少顯著位的所有位代表的數字1,它被設置爲1 。讓我們以最常見的表示 - 一個32位數字。在這樣一個平臺,1是:

00000000 00000000 00000000 00000001 

如果你執行任何其他許多與1位與操作,除了最低顯著位所有位永遠是0。唯一一次結果的最低有效位爲1的時候是另一個數的最低有效位也是1

這些數字:

00000000 00000000 00000000 00000001, which is 1 
00000000 00000000 00000000 00000011, which is 3 
00000000 00000000 00000000 00000101, which is 5 
00000000 00000000 00000000 00000111, which is 7 

等。從模式中可以看出,所有奇數的最低位爲1。所有偶數的最低位爲0。因此,

x & 1 is 1 for all odd values of x 
x & 1 is 0 for all even values of x 
+0

二進制111不是5,它是7 ...並且二進制1111是15.二進制中的5將是101。 – Dmitri

+0

@Dmitri,感謝您指出錯誤。 –