求函数返回值,输入x=9999
(2009-06-02 09:33:06)
标签:
函数个数循环次数二进制数杂谈 |
分类: 技术 |
这个题目已经遇到好几次了,第一次没思路,第二次有些思路,但是好像不对(虽然答案对了),昨天又遇到了一次,今天上网找了一下答案,总之就是把9999变为二进制去做,然后就可以发现规律了。
求函数返回值,输入x=9999;
int func ( x )
{
int countx = 0;
while ( x )
{
countx ++;
x = x&(x-1);
}
return countx;
}
结果呢?
知道了这是统计9999的二进制数值中有多少个1的函数,且有
9999=9×1024+512+256+15
9×1024中含有1的个数为2;
512中含有1的个数为1;
256中含有1的个数为1;
15中含有1的个数为4;
故共有1的个数为8,结果为8。
1000 - 1 = 0111,正好是原数取反。这就是原理。
用这种方法来求1的个数是很效率很高的。
不必去一个一个地移位,循环次数最少。