题目:输入一个整数,求该整数的二进制表达中有多少个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;
}
整数二进制中1的数量
本文介绍了一种高效算法来计算一个整数在二进制表示中1的个数,通过使用位运算符“与”来消除最右边的1,直到整数变为0,该方法的时间复杂度取决于二进制表示中1的数量。

865

被折叠的 条评论
为什么被折叠?



