题目链接: https://leetcode.cn/problems/number-of-1-bits/
视频题解: https://www.bilibili.com/video/BV1ir421M7XU/
LeetCode 191.位1的个数
题目描述
编写一个函数,输入是一个无符号整数 (以二进制串的形式),返回其二进制表达式中数字位数为 1 的个数(也被称为汉明重量)。
视频题解
位1的个数
思路来源
思路来源
思路解析
方法一
定义res保存1的个数。对于无符号整数n,统计其中1的个数步骤如下:
- 如果
n != 0,n对应二进制的最右边一位如果是1,res++,进入步骤2。否则,返回res。 - 把
n对应的二进制向右移动一位,进入步骤1。 
关键在于如何获取n对应二进制的最右边一位和怎样将n对应的二进制向右移一位。
获取n对应二进制最右面一位有两种方式:
n和1进行与运算n & 1可以获取n对应二进制的最右面一位。n对2取余n % 2即可获取n对应二进制的最右面一位。

将n对应的二进制右移一位有两种方式:
- 直接使用编程语言自带的右移符号,比如
c++可以写为n >> 1。 n / 2也可以将n对应的二进制右移一位。

C++代码
class Solution {
public:
    int hammingWeight(uint32_t n) {
        int res = 0;
        while(n) {
           //获取n对应二进制最右边一位
           if (n % 2) {
               ++res;
           }
           //n对应的二进制右移一位
           n = n / 2;
        }
        return res;
    } 
};
 
java代码
class Solution {
    public int hammingWeight(int n) {
        int res = 0;
        while (n != 0) {
            // 获取n对应二进制最右边一位
            if (n % 2 == 1) {
                res++;
            }
            // n对应的二进制右移一位
            n = n / 2;
        }
        return res;
    }
}
 
python代码
class Solution:
    def hammingWeight(self, n: int) -> int:
        res = 0
        while n:
            # 获取n对应二进制最右边一位
            if n % 2:
                res += 1
            # n对应的二进制右移一位
            n = n // 2
        return res
 
方法二
定义res保存1的个数。对于无符号整数n,统计其中1的个数步骤如下:
- 如果
n != 0,res++,进入步骤2。否则,返回res。 n = n & (n - 1),进入步骤1。
n & (n - 1)其实就是将n对应的二进制最右边值为1的bit位置为0。

在纸上继续按照上面步骤模拟一遍,会帮助大家更好的理解。
C++代码
class Solution {
public:
    int hammingWeight(uint32_t n) {
        int res = 0;
        while(n) {
            ++res;
            //n对应二进制最右边不为零的bit位置为零
            n = n&(n-1);
        }
        return res;
    } 
};
 
java代码
class Solution {
    public int hammingWeight(int n) {
        int res = 0;
        while (n != 0) {
            res++;
            // n对应二进制最右边不为零的bit位置为零
            n = n & (n - 1);
        }
        return res;
    }
}
 
python代码
class Solution:
    def hammingWeight(self, n: int) -> int:
        res = 0
        while n:
            res += 1
            # n对应二进制最右边不为零的bit位置为零
            n = n & (n - 1)
        return res
 
复杂度分析
时间复杂度: 两种方法都是O(1),因为二进制最长为32位。
空间复杂度: 两种方法都是O(1),只使用了几个整型变量。


















