编程实现求一个整数的二进制中0和1的个数

声明:假定该数是在32位平台的机器上运行,在更高或最低平台上的原理相同。


核心最优算法:


求1的个数:num&=(num+1)

求0的个数:num |=(num+1)


问题分析:

因为开始时已声明该数是在32位机器上,因此该整数的二进制位总共有32位。

一般思路:采用for循环的方式,因为我们已经知道循环的次数,所以程序只要跑32次,每次将最低位模2,来判断最低位是0还是1,从而达到计数的目的。

优化思路:在实际运用中,我们所测的数一般不会很大,数的最前面可能已经出现了全0的情况,因此我们采用上面提供的核心最优算法来解决这一效率问题。


图示分析(以25为例):




代码实现:


计算二进制中1的个数:


int CountOneBit(int num)
{
	int count = 0;
	/*for (int i = 31; i > 0; i++)	//一般的实现方式
	{
		if (num % 2 == 1)
		{
			count++;
		}
		else
		{
			continue;
		}
	}*/
	while (num)
	{
		count++;
		num &= (num - 1);	//算法转换
	}
	return count;
}

int main()
{
	int value = 25;
	int ret = CountOneBit(value);
	printf("%d中的二进制位1的个数有%d\n",value, ret);
	system("pause");
	return 0;
}

程序运行结果:




计算二进制中0的个数:


int CountZeroBit(int num)
{
	int count = 0;
	/*for (int i = 31; i > 0; i++)	//一般的实现方式
	{
		if (num % 2 == 0)
		{
			count++;
		}
		else
		{
			continue;
		}
	}*/
	while (num + 1)
	{
		count++;
		num |= (num + 1);	//算法转换
	}
	return count;
}

int main()
{
	int value = 25;
	int ret = CountZeroBit(value);
	printf("%d的二进制位中0的个数为%d\n",value, ret);
	system("pause");
	return 0;
}

运行结果:




一点小技巧:


上述的算法也可以只掌握一种,通过总的平台为数减去其中的一个就可以求出另外一个的位数,同时也可以用来验证计算的结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

double_happiness

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值