题目:输入一个整数,求该整数的二进制表达中有多少个1。
例如输入10,由于其二进制表示为1010,有两个1,因此输出2。
分析:
这是一道很基本的考查位运算的面试题。
包括微软在内的很多公司都曾采用过这道题。
思路:
设一个数的二进制是 a1 a2 a3 a4 ……an ,其中ai 是0 或者1; 要求其中1的个数,只需设置一个计算器。
若an=0,那么 其%2必定是0,那么计数器不加,否则加+1;这种方法的复杂度是O(lgn);
假设ai到an全为0,我们怎么才能最快的除掉这么多0呢,用 & 能办到。
例如: 12 是 1100
那么12&11 =》 1100 & 1011 =》 1000,这样相当于去掉了后面的0不考虑,而只对1有作用,计数器+1;
这样复杂度是 1的个数,比上面的 lgn 要好;
#include <iostream>
using namespace std;
int main()
{
int a;
int num = 0;
while ( !(cin >> a).eof() )
{
num = 0;
while (a)
{
a = a&(a-1);
num++;
}
cout << num << endl;
}
return 0;
}