一道和位与操作(&)相关的趣题

googleTopLanguage论坛中看到一道题目,和位与操作(&)相关。


 

先简单回顾一下什么叫做位与操作符:

位与操作(&)需要两个整型操作数,在每个位的位置,如果两个操作数对应的位都为 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; 

}

test9999



 

最后解答:

“n = n & (n - 1)”说明 这其实就是一个位于操作的题目。问题是9999到底等于二进制的多少,这个需要计算出来么?常规解法是计算出来然后按位与,但是其实是也可以不用计算出来,比如论坛上有网友doyle解答如下:

假设9999的二进制表达为xxxxxxxxxx...xxx1,显然最后一位是1(因为是奇数
则可知9998二进制表达为xxxxxxxxxx...xxx0,显然最后一位是0(因为是偶数
显然,9999&9998=>9998(xxxxxxxxxx...xxx0) 
然后是9998&9997=>我不知道是多少,但是,肯定是xxxxxxxxxx...xx00 
继续下去,就是xxxxxxxxxx...xxx0xxxxxxxxxx...xxx()0()相与 

所以最后n = 9999表达为2进制时需要多少位?
于是  取整(log(9999,2))=13,所以n=14 “

非常流畅的解答!

 

 

你可能感兴趣的:(Google)