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

本文介绍了一种高效算法来计算一个整数在二进制表示中1的个数,通过使用位运算符“与”来消除最右边的1,直到整数变为0,该方法的时间复杂度取决于二进制表示中1的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值