if((x & 1) == 0)
printf("EVEN!\n");
else
printf("ODD!\n");
爲什麼X&1
總會給人1
時數是奇數。我的意思是這個操作過程中發生內存可以在任何一個解釋嗎?關於位運算符
if((x & 1) == 0)
printf("EVEN!\n");
else
printf("ODD!\n");
爲什麼X&1
總會給人1
時數是奇數。我的意思是這個操作過程中發生內存可以在任何一個解釋嗎?關於位運算符
二進制中的每個奇數都有設置的最低位。並且X & 1
總是測試那個位。因此,檢查總是如此。
如果你不明白爲什麼第一條語句是真的,那麼只需將幾個十進制數轉換爲二進制數就可以了。
1 == 00000001b
3 == 00000011b
5 == 00000101b
7 == 00000111b
etc
然後就可以肯定,做同樣的幾連號以驗證最低位始終爲0:
2 == 00000010b
4 == 00000100b
6 == 00000110b
8 == 00001000b
etc
這是因爲二進制數。每個二進制數是2到某個數的冪的集合。如果你正在尋找4位數,那麼只有奇數是1(2的冪0)。如果您正在尋找例如12號它是二進制表示1100。當你把1面具,它看起來像這樣
1100
&0001
0000
如果你選擇一個奇數,例如3,你有 0011 &0001 0001
作爲你只能看到二進制數的最後一個數字是奇數,1是00000001
無論什麼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
二進制111不是5,它是7 ...並且二進制1111是15.二進制中的5將是101。 – Dmitri
@Dmitri,感謝您指出錯誤。 –
什麼部分你不明白?你有沒有嘗試自己編寫二進制代碼和數字?維基百科也有[良好條目](https://en.wikipedia.org/wiki/Bitwise_operations_in_C)。 – Evert
你在C書,任何在線教程,維基百科等中究竟有什麼不明白的地方? – Olaf
'(x&1)'隔離最不重要的位。每個比特對應於2的冪,與十進制數的每個數字對應於十的冪相同 - 對於低位,奇數的唯一整數冪是2^0。其他位對奇數/偶數沒有影響,因爲無論您將多少個偶數加在一起,結果仍然是偶數......但是比任何偶數(加入2^0的相同數)多一個將是奇數。 – Dmitri