位运算-统计位1的个数
2024-08-15 00:00:03  阅读数 318

题目leetcode191
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数
示例

输入:00000000000000000000000000001011
输出:3

解题思路

思路1

直接循环检查给定整数 n 的二进制位的每一位是否为 111。


image.png

image.png
public class Solution {
    public int hammingWeight(int n) {
        int ret = 0;
        for (int i = 0; i < 32; i++) {
            if ((n & (1 << i)) != 0) {
                ret++;
            }
        }
        return ret;
    }
}

思路2

使用 n & (n−1) 把 n 的二进制位中的最低位的 1 变为 0


image.png

然后不断让当前的 n 与 n−1 做与运算,直到 n 变为 0 即可。

public class Solution {
    public int hammingWeight(int n) {
        int ret = 0;
        while (n != 0) {
            n &= n - 1;
            ret++;
        }
        return ret;
    }
}