28.整数的二进制表示中1 的个数

题目:输入一个整数,求该整数的二进制表达中有多少个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;
}

点赞