统计一个数的二进制中有几个1--20150926

本文介绍了一种高效计算整数二进制表示中1的数量的方法。通过不断将数字与其减一后的结果进行按位与运算,直到数字变为0,过程中每进行一次运算就增加计数器的值。最终计数器的值即为二进制中1的个数。
//题目描述:统计一个数的二进制中有几个1

//思路:n=n&(n-1);是将n的二进制最右边的1转为0,统计该操作可以执行的次数就是二进制中1的个数。

int NumberOf1(int n){
    int count=0;
    while(n){
        ++count;
        n=n&(n-1);
    }
    return count;
}
判断一个二进制1的个,有以下几种方法: 1. **按位与法**:通过`n & (n - 1)`表达式去掉二进制序列中最右边的1,每进行一次操作,就会去掉一个1,直到整个二进制全为0,操作的次就是1的个。示例代码如下: ```python def count_ones(n): count = 0 while n: n = n & (n - 1) count = count + 1 return count ``` 该方法的核心思想是每次按位与操作后,最右边的1会消失,二进制位有多少1就执行`n = n & (n - 1)`多少次,直到整个二进制全为0 [^1]。 2. **右移判断法**:把这个转变为二进制,然后判断最小位是否为1,然后把字右移一位,继续判断,直到最后二进制等于0。示例代码如下: ```java private static int NumberOf1_One(int n) { int count = 0; while (n != 0) { if ((n & 1) == 1) { count++; } n = n >> 1; } return count; } ``` 此方法通过不断右移字,并判断最末位是否为1统计1的个 [^2]。 3. **逐位判断法**:将这个1进行按位与,如果结果是1,那么这个的最末位就是1,判断完最末位,再将这个进行右移运算,判断倒第二位,如此循环32次(对于32位整),就判断出了这个二进制序列中有多少1。示例代码如下: ```c #include <stdio.h> #include <stdlib.h> int count_one_bits(int n) { int count = 0; int i = 0; for (i = 0; i < 32; i++) { if (((n >> i) & 1) == 1) { count++; } } return count; } int main() { int num = 0; scanf("%d", &num); int ret = count_one_bits(num); printf("%d\n", ret); system("pause"); return 0; } ``` 该方法弥补了模2除2法只能判断正的缺陷,通过循环32次判断每一位是否为1 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值