今天看到一道面試題:
題目是這樣的:
#include
using
namespace
std;
int func(int x)
return count;
}int main()
a.8 b.9 c.10 d.11
經過我用最原始的計算方法計算
9999 二進位制10 0111 0000 1111
10 0111 0000 1111
& 10 0111 0000 1110
= 10 0111 0000 1110
& 10 0111 0000 1101
= 10 0111 0000 1100
& 10 0111 0000 1001
= 10 0111 0000 1000
& 10 0111 0000 0001
= 10 0111 0000 0000
& 10 0110 0000 0001
= 10 0110 0000 0000
& 10 0100 0000 0001
= 10 0100 0000 0000
& 10 0000 0000 0001
= 10 0000 0000 0000
& 00 0000 0000 0001
= 00 0000 0000 0000
結果為a。
分析:每執行一次x = x&(x-1),會將x用二進位制表示時最右邊的乙個1變為0,因為x-1將會將該位(x用二進位制表示時最右邊的那個1)變為0。(假設該位為第k位,減1後,該位後面全部變成1,但是由於該位是最右邊的1了,所以x的第k位後面全是0,而x-1的第k位是0,從1到k-1位全是1,按位與的結果自然就是第k位和1~k-1位都變成0。)
所以func()這個函式的作用是統計9999這個數字轉化為二進位制後,1的個數是多少。
除了這個功能以外
x & (x - 1)
用處:
①將最低的為1的位變成0.
②當x為奇數的時候,x = x & (x - 1);一樣的效果;
x 為2的n次冪時,結果為0,這可以用來快速判斷乙個數是否為2的n次方。
whiy?
因為如果乙個數為2的n次冪,那麼其最高位為1。
#include
int func(int
x)int main()
x x 1 表示式的意義
求下面函式的返回值 微軟 統計1的個數 int func int x return countx 假定x 9999 10011100001111 答案 8 思路 將x轉化為2進製,看含有的1的個數。注 每執行一次x x x 1 會將x用二進位制表示時最右邊的乙個1變為0,因為x 1將會將該位 x用二...
x x 1 表示式的意義
求下面函式的返回值 微軟 統計1的個數 int func int x return countx 假定x 9999 10011100001111 答案 8 思路 將x轉化為2進製,看含有的1的個數。注 每執行一次x x x 1 會將x用二進位制表示時最右邊的乙個1變為0,因為x 1將會將該位 x用二...
x x 1 表示式的意義
2007 12 04 20 13 求下面函式的返回值 微軟 統計1的個數 int func int x return countx 假定x 9999 10011100001111 答案 8 思路 將x轉化為2進製,看含有的1的個數。注 每執行一次x x x 1 會將x用二進位制表示時最右邊的乙個1變...