在google的TopLanguage论坛中看到一道题目,和位与操作(&)相关。
先简单回顾一下什么叫做位与操作符:
位与操作(&)需要两个整型操作数,在每个位的位置,如果两个操作数对应的位都为 1,则操作结果中该位为 1,否则为 0。
unsigned char b1 = 0145; 表达为二进制,结果如下
0 1 1 0 0 1 0 1
unsigned char b2 = 0257; 表达为二进制,结果如下
1 0 1 0 1 1 1 1
那么,unsigned char result = b1 & b2; 表达为二进制,结果如下
0 0 1 0 0 1 0 1
然后看题:
int test(int n)
{
int nCount = 0;
while(n)
{
nCount++;
n = n & (n - 1);
}
return nCount;
}
求test(9999)
最后解答:
“n = n & (n - 1)”说明 这其实就是一个位于操作的题目。问题是9999到底等于二进制的多少,这个需要计算出来么?常规解法是计算出来然后按位与,但是其实是也可以不用计算出来,比如论坛上有网友doyle解答如下:
“假设9999的二进制表达为xxxxxxxxxx...xxx1,显然最后一位是1(因为是奇数)
则可知9998二进制表达为xxxxxxxxxx...xxx0,显然最后一位是0(因为是偶数)
显然,9999&9998=>9998(xxxxxxxxxx...xxx0)
然后是9998&9997=>我不知道是多少,但是,肯定是xxxxxxxxxx...xx00
继续下去,就是xxxxxxxxxx...xxx0和xxxxxxxxxx...xxx(反)0(反)相与
所以最后n = 9999表达为2进制时需要多少位?
于是 取整(log(9999,2))=13,所以n=14 “
非常流畅的解答!