c语言数据结构无符号整数二进制中1的个数

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int res = 0;
        while (n != 0) {
            res += n % 2;
            n /= 2;
        }
        return res;
    }
};

这是判断无整数的二进制中1的代码,这是一个leetcode题,核心代码是在while循环中的那两行代码,其中的规律我搞不懂

这很简单,res += n % 2,如果n的最后一位是1,那么res就+=1,否则+=0
而n /= 2;就是把最后一位丢弃,倒数第二位作为最后一位。
假设有一个二进制 10110(2)
那么
10110 (2) % 2 = 0 res +=0
10110 (2) / 2 = 1011(2)
1011 (2) % 2 = 1 res +=1
1011 (2) / 2 = 101(2)
101 (2) % 2 = 1 res += 1
101 (2) / 2 = 10(2)
10 (2) % 2 = 0 res+=0
10 (2) / 2 = 1(2)
1(2) % 2 = 1 res+=0
1(2) / 2 = 0(2)
此时n = 0,跳出循环
而此时 res 就是把所有的1加起来了。

该回答引用ChatGPT-3.5,仅供参考,不保证完全正确

这段代码使用了位运算来计算无符号整数(uint32_t类型)中二进制表示中1的个数,也称为汉明重量(Hamming Weight)。让我们逐行解释代码的含义:

int hammingWeight(uint32_t n) {
    int res = 0;  // 初始化结果变量为0
    while (n != 0) {  // 当 n 不等于0时进行循环
        res += n % 2;  // 将 n 除以2的余数加到结果中,即判断 n 的最低位是否为1
        n /= 2;  // 将 n 除以2,相当于将二进制表示向右移动一位
    }
    return res;  // 返回结果
}

这个算法的基本思想是,通过反复将输入的无符号整数 n 除以 2 并检查余数,累加余数为1的个数,然后将 n 右移一位,继续重复这个过程直到 n 为0。当 n 右移至0时,意味着所有的位都被检查完毕,此时返回累加的结果。


这个方法的关键是利用了整数除法的性质:对于整数 a 和 b,a/b 的结果为商的整数部分,而 a%b 的结果为 a 除以 b 的余数部分。在这里,我们利用 n%2 来判断 n 的最低位是否为1,然后将 n 除以2(相当于右移一位),继续判断下一位。


这样做的原理是,当一个二进制数 n 右移一位时,相当于将最低位去掉,而其他位依次向右移动填补空位。因此,通过不断地右移和检查最低位的值,我们可以逐个统计出二进制数中1的个数。


总结起来,这段代码使用了循环和位运算的方法来统计无符号整数二进制表示中1的个数,是一种常用且高效的解法。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/690534
  • 你也可以参考下这篇文章:LeetCode:给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序
  • 除此之外, 这篇博客: 第一篇博客,论如何选择leetCode 刷题语言.中的 首先,刷题我们要选择一门语言 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    c java python JavaScript
    c语言 需要自己手动写一些基础数据结构,对于初期锻炼理解有用,但是硬刚会浪费一些时间,除非你是c系列工程师
    java 面向对象的经典语言,目前需求稳定,学习需要一定的基础.基本的数据结构与方法完善,复杂.
    python最火爆的语言之一,人工智能的必经之路,代码简洁易懂,适合刷算法题,高效简洁.
    JavaScript 脚本语言,却很强大.个人感觉不适合刷题. 爬
    再结合c的基层性,与复杂性,理解好了基本的数据结构后,就可以省时间的直接调用了,so,爬.
    还剩下 java与python.就知识掌握度来说,基本一样,都…忘干净了.
    就前景与实用度来说,还是python快捷实用,就你了.

  • 以下回答来自chatgpt:

    这段代码的作用是统计给定32位无符号整数 n 在二进制下有多少个1。下面解释一下具体实现方法:

    n & 1 的作用是用二进制位与操作符 & 计算 n 的二进制末位是否为1。因为1的二进制最低位就是1,其它位都是0。所以当 n 的二进制末位为1时,n & 1 的结果就是1,否则结果为0。每次循环都将统计到的1的个数加上这个值,最后返回统计到的1的总个数。

    循环中需要右移 n 的原因是为了遍历 n 的每一位。因为C语言默认使用补码存储整数,右移n 相当于把整数减半,将最低位移到次低位再将其次低位移到更高一位,这样依次操作,每次判断最低位是否是1,当整数 n 等于0时统计就结束了。

    以下是完整代码实现:

    #include <stdio.h>
    
    int hammingWeight(uint32_t n) {
        int count = 0;
        while (n != 0) {
            count += n & 1;
            n >>= 1;
        }
        return count;
    }
    
    int main() {
        uint32_t n = 0b01001011; // 二进制表示的整数
        int count = hammingWeight(n);
        printf("二进制数 %u 中共有 %d 个1\n", n, count); 
        return 0;
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^