C语言:两种方法求一个整数存储在内存中的二进制中1的个数

相关题目链接:二进制中1的个数

基础方法:按位与1,求出最后一位是0还是1

int NumberOf1(int a ) {
    // write code here
    int tmp = a;
	int count = 0;
	if (a >= 0)
	{
		while (a)
		{
			if (a & 1) {//可以判断出当前a最后一位是1还是0
				count++;
			}
			a = a >> 1;
		}
	}
	else
	{
		//负数右移,我这个编译器是算术右移(大多数编译器都是算术右移)
		//算术右移就是,最右边数丢弃,左边补符号位,因为是负数也就是补1
		//这里如果还用while(a)就会一直死循环下去,因为左边会一直补1
		//但我们是知道整形是32位存储在内存里面的,我们循环32次即可
		for (int i = 0;i < 32;i++)
		{
			if (a & 1) {//可以判断出当前a最后一位是1还是0
				count++;
			}
			a = a >> 1;
		}
	}
    return count;
}

进阶方法::n=n&(n-1),把最末位的1去掉
举个例子:
n=5,二进制为0101
n-1=4,二进制为0100
n=n&n-1=0100,也就是十进制的4
到这里0101的最后一位1被移除

n=4,二进制为0100
n-1=3,二进制为0011
n=n&n-1=0000
到这里,0100最后一位1被移除,变成了0,循环结束

int NumberOf1(int a ) {
    // write code here
    int count = 0;
	while(a)
    {
        a=a&(a-1);
        count++;
    }
    return count;
}

牛客网测试通过截图
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

劲夫学编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值