题目:
有如下一段代码,假设x初始为9999,则执行完nCount值为()
int nCount = 0;
while (x) {
nCount++;
x = x & (x - 1);
}
A. 32
B. 999
C. 8
D. 1
答案:C
(选中方块查看)
解析:
把 9999 化为二进制,即 0010 0111 0000 1111。
第一次循环:9999和9998相与,即 0010 0111 0000 1111 & 0010 0111 0000 1110,计算可得0010 0111 0000 1110,即9998,此时nCount = 1。(与运算两位同时为“1”,结果才为“1”,否则为0)
第二次循环:9998和9997相与,计算得9996。
第三次循环:9996和9995相与,计算得9992。
……
由此可见,每进行一次 x&(x-1)的运算,所得结果的二进制数就会少一个1(按位与后变为0),最后x的二进制数中没有1了就得到0,该题就是在计算x的二进制数中1的个数