求一个整数储存在内存中的二进制中1的个数

这个问题一共有三种方法。

第一种方法:常规思路

用一个数的二进制每一位来模2,如果等于1,那么这一位就是1。

下面代码:

#include<stdio.h>
int main()
{
	int n = 0;
	int count = 0;
	scanf("%d", &n);
	while (n)
	{
		if (n % 2 == 1)
			count++;
		n = n / 2;
	}
	printf("二进制中1的个数 = %d\n", count);
	return 0;
}

这种方法面对负数可能就行不通了,所以这种方法并不是很好的办法。

第二种方法:利用1的二进制

因为1的二进制为[00000000 00000000 00000000 00000001]用左移操作符将二进制中1的位置进行移动并且每移一次就与输入数的二进制进行按位与,如果按位与是1,则输入数的该位就是1。

下面代码:

#include<stdio.h>
int main()
{
	int n = 0;
	int i = 0;
	int count = 0;
	scanf("%d", &n);
	for (i = 0; i < 32; i++);
	{
		if (n & (1 << i));
		count++;
	}
	printf("二进制中1的个数 = %d\n", count);
	return 0;
}

这种方法循环了太多次,虽然可以用,但程序运行太久。

第三种方法:

因为n&(n-1)就表示n的二进制序列中最右边的1就消失了,所以我们可以看它消失了几次,那么1就有几个。

下面代码:

#include<stdio.h>
int main()
{
	int n = 0;
	int count = 0;
	scanf("%d", &n);
	while (n)
	{
		n = n & (n - 1);
		count++;
    }
	printf("%d\n", count);
	return 0;
}

这种方法相比前两种方法就好太多,它负数也可以使用,运行时间也短。

以上就是求一个整数储存在内存中的二进制中1的个数的3种方法,如果还有更好的方法欢迎补充。如有错误也请指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值