1,代码分析:
#include <iostream>
using namespace std;
int func(int x)
{
int count = 0;
while(x)
{
count++;
x = x&(x-1);
}
return count;
}
int main()
{
cout << func(9999) << endl;
return 0;
}
求输出?
看到这个题目之后就不知道怎么弄了,我就在想一个数和比它小1的数相与的结果是什么呢,想不明白。于是拿出了最笨的办法,死算。
我先求出了9999的二进制形式,然后展开计算。
9999 对应的二进制: 10011100001111
开始计算:
10011100001111
10011100001110
10011100001110
10011100001101
10011100001100
10011100001011
10011100001000
算到这里的时候,不知大家发现规律了没有。我看到,每一次计算之后,x的二进制形式的最后一位1消失了。仔细分析一下,x 和 (x-1)的关系,其实,x-1 就是将x二进制形式的最后一位1改为0,然后,从最后一位1的下一位开始都变为1 。这样x 与 x-1 进行与运算之后,就相当于将x的最后一位1去掉。
最后得出结论:该代码的目的就是求出x化为二进制之后,1的个数。
所以,结果是 8