C::求一个数的二进制中1的个数

求二进制中1的个数,你们三种看到这个问题,会想到什么方法?这里我提供方法:(最后一位是一位大神想出来的,很牛逼!)慢慢往下看。

1) 

int Count_One_Bits(int value)
{
	int count = 0;
	while(value)
	{
		if(value%2 == 1)//这个数模2为1,则此位就为1
		{
		    count++;
		}
		value = value/2;
	}
	return count;
}

2)在计算机中数的存储是由32位0,1代码组成的(当然是位操作系统中)所以我们采取如下的方式进行计算。

int Count_One_Bits(int value)
{
	int count = 0;32
	int i = 0;
	for(i = 0; i<32; i++)
	{
		if(((value>>i)&1) == 1)
		{
			count++;
		}
	}
	return count;
}

3)刚才说了,有一个神奇的公式,此公式就是n = n&(n-1)。我来解释下这个公式是如何进行求解一个数的二进制位个数的。举个例子:(在32位操作系统下)

A:比如求15,15在计算机中的存储就是0000 0000 0000 0000 0000 0000 0000 1111

我们为了方便说明期间,就只取后4位进行研究。那么15就是1111

B:来看这个公式n = n&(n-1),此时的n就是15,n-1 = 14,即就是1110,它们俩&运算之后结果就是1110,依次类推:14&13结果就是1100,最终就会变成0000。说到这里,聪明的你似乎发现了什么。是的,这个公式就是将逐位清零,你有多少个1,就循环清多少次。我们来看下代码:

int Count_One_Bits(int value)
{
    int count = 0;
	while(value)
	{
		if(value%2 == 1)
		{
			count++;
		}
		value = value/2;
	}
	return count;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值