题目:
对于一个字节的无符号整形变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能高
分析:其实很简单,对于8这样的一个数,其二进制1000,其1的个数为1.
可以将它与它减1的数相与,这样相当于1000与0100相与一次,结果为0
对于10,其二进制1010,其1的个数为2
按照上术的思路,1010与1001相与一次结果为1000
1000再与0111相与,结果为0
……
可以得出结论,求一个二进制数中1的个数可以将它与它减1的数相与,直到最后结果为0
对于一个字节的无符号整形变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能高
分析:其实很简单,对于8这样的一个数,其二进制1000,其1的个数为1.
可以将它与它减1的数相与,这样相当于1000与0100相与一次,结果为0
对于10,其二进制1010,其1的个数为2
按照上术的思路,1010与1001相与一次结果为1000
1000再与0111相与,结果为0
……
可以得出结论,求一个二进制数中1的个数可以将它与它减1的数相与,直到最后结果为0
相与多少次则为1的个数
#include<iostream>
using namespace std;
int findOne(int x)
{
int count = 0;
while (x)
{
x = x & (x - 1);
count++;
}
return count;
}
int main()
{
int x = 8;
cout << findOne(x) << endl;
system("pause");
return 0;
}