C语言 二进制中1的个数

本文介绍了一种计算给定整数中二进制表示形式下1位数量的方法。通过不断对数字进行模2操作并右移,直至数字变为0,以此来判断和累加每一位是否为1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:
每个二进制的数字%2可以判断出它的最低一位是不是1,所以给这个数字每次%2,然后右移一位,直到这个数字等于0,即可判断出每一位是不是1。

#include<stdio.h>

int num1(int n)
{
    int num = 0;
    while(n>0)
    {
        if(n%2 == 1)
        {
            num++;
        }
        n = n>>1;
    }
    return num;
}
int main()
{
    int n;
    scanf("%d",&n);
    int tmp = num1(n);
    printf("%d\n", tmp);
    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; } ``` 这种技巧不仅简洁而且高效特别适合处理大范围内的正整数.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值