C语言 求一个整数存储在内存中的二进制中1的个数(多种方法详解)

举例:8 二进制为 1000 1的个数为1

7 二进制为 0111 1的个数为3

方法一:

#include<stdio.h>
int main()
{
	unsigned char n= 7;
	int count = 0;

	for (int i = 0; i < 8; i++)
	{
		if (n & 0x01)
		
			count++;
		n >>= 1;
	}
	printf("%d\n",count);
	
	return 0;
}

i 可以随着你的数字大小自己调整,让输入数字的二进制最后一位每次都和1进行与运算,若都为1,则if函数内为真,执行count++,若不为1,if括号内函数为假,不执行++.

每次运行完if函数之后,将n的二进制右移一位,开始下一轮比较。

注意:在这里就学到如何看某二进制中某一位是否为1

比如 1000 0011

当你想知道第四位是否为1时

可以与 0x08 也就是0000 1000 进行 与运算 如果结果为0,那说明第四位为0

方法二:

其他内容不变:只需要对循环处加以改动

while(n)
{
    int count;
    if(n % 2 == 1)
    {
        count++;
    }
    n /= 2;
}

本质上和方法一类似,都是对这个数二进制末尾的判断,当末尾为1时,对2取余则为1,if函数为真,执行count++。  接着对n进行/=操作,向前移动1位。

此方法与方法一比效率上未得到较大提升

方法三

此方法在前两种方法的基础上,效率大大提高,循环次数通过输入数字判断

n = 7           0000 0111

n  -   1 = 6   0000  0110

&之后          0000 0110    =  n

n  -   1   =    0000  0101

&                 0000  0100  =n

n - 1 =         0000  0011

&                 0000 00000

此处经过三次  &  运算  count++  三次 得到正确结果

#include<stdio.h>
int main()
{
	unsigned char n= 7;
	int count = 0;
    
    while(n)
    {
        n &= (n - 1);
        count++;
    }

	printf("%d\n",count);
	
	return 0;
}

方法四:

除此之外还有一种方法可以参考:查表法。  即提前罗列好所有结果,待数字输入后直接判断对应答案结果,这种方法的核心思想为用空间换时间,代码运算效率相比于前面几种方法来说最高,但是需要编写罗列大量结果,定义如下

int a[]={0 ,1,1,2,2,.......}

定义的数组里面即8位二进制中包含所有数字的题目要求答案,我们不一一列举,这种思想在实际操作中一般很少用到,但是不妨碍我们知道学习它思想。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值