【C语言】求二进制中1的个数(三种方法)

前言
🎈大家好,我是何小侠🎈
🌀大家可以叫我**小何或者小侠🌀**
🔴我是一名普通的博客写作者🔴
💐希望能通过写博客加深自己对于学习内容的理解💐
🌸也能帮助更多人理解和学习🌸
🍃我的主页: 何小侠的主页🍃

在这里插入图片描述


    这篇博客我们一起来学习有关于二进制位的操作。希望能提高大家对二进制的理解。
    🍊

    在这里插入图片描述

    题目🍊

    编写代码实现:求一个整数存储在内存中的二进制中1的个数。
    我们下面介绍三种方法

    第一种方法🍊

    在介绍第一种方法之前我们先要知道一个概念,会有利于我们理解。

    假如有n = 1234 这样一个数据,如果我们 %10 就得到了4 ,
    如果我们 /10 就得到123,这个大家应该是理解的,但是换在二进制又如何呢?

    在这里插入图片描述

    int main()
    {
       
    	int i = 0;
    	scanf("%d", &i);
    	int count = 0;
    	while (i != 0)
    	{
       
    		if (i % 2 == 1)
    		count++;
    		i /= 2;
    
    	}
    	printf("%d", count);
    
    	return 0;
    
    ### C语言实现计算整数二进制表示中1个数 #### 取余法 通过不断对2取余并累加余数可以统计二进制表示中有多少个1。每次模操作后,将原数值右移一位继续上述过程直到该数值变为零。 ```c int countBitsRemainder(int num){ int cnt = 0; while (num != 0) { cnt += num % 2; // 如果当前最低位是1,则计数器增加 num /= 2; // 将数字向右移动一位相当于去掉最后一位 } return cnt; } ``` 此方法简单直观但是效率较低因为涉及到大量的除法运算[^1]。 #### 移位法 利用按位与(&)以及无符号右移(>>)的操作来逐位检测每一位是否为1,并且每轮循环都将目标值减半直至其归零为止。 ```c unsigned int countSetBitsShift(unsigned int n){ unsigned int count = 0; while (n) { count += n & 1u; // 判断最右边的一位是不是1 n >>= 1; // 把这个数往右移去下一次判断下一个低位 } return count; } ``` 这种方法相较于前一种性能更优因为它只用了基本逻辑指令而没有复杂的算术运算。 #### 高级计算法——Brian Kernighan’s Algorithm 对于非负整数x来说,`x&(x−1)`会使得x中最右侧的那个'1'变成'0',因此可以通过重复执行这一操作直到整个数变为全0从而得知其中含有几个1. ```c int bitCountBKAlg(unsigned long x){ int bits = 0; while(x!=0){ ++bits; x &= (x - 1); } return bits; } ``` 这种技巧不仅简洁而且高效特别适合处理大范围内的正整数.
    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    打赏作者

    He XIAO xia

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

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

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

    打赏作者

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

    抵扣说明:

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

    余额充值