剑指 Offer 15. 二进制中1的个数 - 力扣(LeetCode) (leetcode-cn.com)
目录
直观解法
原数右移.
class Solution {
public:
int hammingWeight(uint32_t n) {
int num = 0;
while (n) {
num += n & 1;
n >>= 1;
}
return num;
}
};
基本解法
1不断左移,检查每一位.
class Solution {
public:
int hammingWeight(uint32_t n) {
int count = 0;
for (uint32_t one = 1; one; one <<= 1) {
(n & one) ? ++count : NULL;
}
return count;
}
};
完美解法
有多少个1就进行多少次操作,没有多余的操作。
原理:把一个数减一,相当于把它最右边的1变成0,同时把最右边所有0变成1,把n与n-1做与运算,就可以消除n最右边的1.
class Solution {
public:
int hammingWeight(uint32_t n) {
int count = 0;
while (n) {
++count;
n &= n - 1;
}
return count;
}
};