求二进制数中1的个数

求二进制数中1的个数

相信大家都做过给一个十进制的整数n,然后判断这个整数有多少位,最后将每位的数字输出。利用了整型数据除法的特点。通过相除判断余数的值来分析。
而二进制也可以考虑利用整型数据除法的特点,只是除的是2而不是10,在此就只提供思路而不写代码。
本次主要介绍的是使用位操作来进行的。
我们知道,向右移位操作同样可以达到相除的目的。唯一不同之处在于,移位后如何判断是否有1存在。那我们进要进行与1的操作来判断最后一位是0还是1。

int countbits1(unsigned char ch)
{
	int count = 0;
	while (ch!=0)
	{
		if((ch&1)!=0)
		{
			count++;
		}
		ch>>=1;
	}
	return count;
} 

为了简化这个问题,我们考虑只有一个1的情况。例如:01000000。
若要判断二进制还总有一个1,可以判断这个数是否是2的整数次幂来实现。但如何之和这一个“1”进行判断呢?
若希望操作后的结果为0,01000000可以和00111111进行与操作。
这样,要进行的操作是01000000&(01000000-0000001)=01000000&00111111=0.

int GetBits2(unsigned char ch)
{
	int count = 0;
	while(ch != 0)
	{
		count++;
		ch &= (ch-1);//丢弃二进制最右边的1
	}
	return count;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值