位1的个数:一种高效且优雅的解法

位1的个数:一种高效且优雅的解法_第1张图片

本篇博客会讲解力扣“191. 位1的个数”的解题思路,这是题目链接。

位1的个数:一种高效且优雅的解法_第2张图片

要想求解二进制位中1的个数,首先要了解一个神奇的表达式:n &= n - 1。这个表达式的含义是:把n的二进制中最低位的1变成0,也就是消除n的二进制中最低位的1。比如,当n是11时,二进制是1011,此时若执行n &= n - 1,相当于把二进制的1011和1010进行按位与,结果的二进制是1010,相当于把原来的11的二进制1011最低位的1消除了。

既然执行n &= n - 1就能消除n的二进制最低位的1,那我们就反复执行这个表达式,每次执行一次都消除一个1,直到n变成0为止。这样,我们就可以统计出执行了多少次,也就是一开始的n的二进制中有多少个1。所以求解一个无符号整数n的二进制中1的个数的方法就是:反复执行n &= n - 1直到n变成0,记录执行次数,即为n的二进制中1的个数。

int hammingWeight(uint32_t n) {
    int ret = 0;
    while (n)
    {
        // 去掉最右边的1
        n &= n - 1;
        ++ret;
    }

    return ret;
}

位1的个数:一种高效且优雅的解法_第3张图片

总结

n &= n - 1消除n的二进制最低位的1,直到n为0,即可求出n的二进制中1的个数。

感谢大家的阅读!

你可能感兴趣的:(力扣刷题,c语言,算法,开发语言,力扣,leetcode)