2.1.1 【每日一练】求二进制数中1的个数

【来源】:编程之美 P119


求一个8位无符号整型变量的二进制形式中“1”的个数,要求算法尽可能效率高。


一个整数的二进制形式中除了“0” 就是“1”;如何计算“1”的个数,可以联想到计算机组成原理中的除法运算的实质,除法运算实质就是右移一位二进制。


先将整数写成二进制形式,然后判断最后一位是否是“1”,若是,则计数器加一,否则,继续,然后右移一位,直到判断所有的数位。


判断最后一位是否是“1“,直接联想到的就是采用与操作,将其与0x01与操作,判断其结果,若为”1“,则最后一位是”1“,否则是”0“


这是一种判断方法,想一想,右移一位,相当于除以2,因此可用除法代替,让整型的数除以2,若余数为1,则说明该数的二进制形式结尾是”1",,否则说明二进制形式结尾是“0”


测试代码如下:

#include <iostream>

using namespace std;

int Count1(int v)
{
	//除法形式判断最后一位
	int num = 0;
	while(v)
	{
		if(v%2==1)
		{
			 num ++;
		}
		v = v/2;
	}
	return num;
}

int Count2(int v)
{
	//采用移位方式判断最后一位
	int num =0;
	while(v)
	{
		num += v&0x01;
		v>>=1;
	}
	return num;
}
int main()
{
	int v;
	v=3;
	cout<<"num of "<<v<<"is "<<Count2(v)<<endl;
	return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值