统计一个整数二进制表示中1的个数

最高效的就是方法三!
但是我们循序渐进进行求解。

方法一:

假设有一个整数为15 则其二进制就是 1111
如果 1111 对2取余为1则表示该位为1
此时我们就要去计算下一位,利用除2的思想,可以一位一位去计算,从而获得1的个数。

#include <stdio.h>
int count_bit_one(unsigned int n)
{
	int count=0;
	while(n)
	{
		if((n%2)==1)
		{
			count++;
		}
		n/=2;
	}
	return count;
}
int main()
{
	int input=0;
	printf("请输入一个整数>:");
	scanf("%d",&input);
	int count=count_bit_one(input);
	printf("count = %d",count);
	return 0;
}

利用整数 除2模2的特性,进行计算,这里需要注意的地方时 函数的入口参数为 无符号整形,是为了方便计算负数二进制中1
的个数。

方法二:

假设有一个整数为 15 其二进制就是 1111 则
在这里插入图片描述

#include <stdio.h>
int count_bit_two(int n)
{
	int count=0;
	int i=0;
	for(i=0;i<32;i++)
	{
		if(((n>>i)&1)==1)
		{
			count++;
		}
	}
	return count;
}
int main()
{
	int input=0;
	printf("请输入一个整数>:");
	scanf("%d",&input);
	int count=count_bit_two(input);
	printf("count = %d \n",count);
	return 0;
}

方法2较方法1有了明显的改善,但仍不是最优解。

方法三:

假设有一个整数为 15 其二进制序列为 1111
则 n=n&(n-1) --> 1111&1110–>1110
不难发现每当n&(n-1) n就会少一个1 因此

#include <stdio.h>
int count_bit_three(int n)
{
	int count=0;
	while(n)
	{
		n=n&(n-1);
		count++;
	}
	return count;
}
int main()
{
	int input=0;
	printf("请输入一个整数>:");
	scanf("%d",&input);
	int count=count_bit_three(input);
	printf("count = %d\n",count);
	return 0;
}

方法3就相比于前两种更加高效! 方法2最少循环32次,而方法3则是有几个1 就循环几次,因此方法3是最高效的代码!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值