191.位1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
遍历方法
通过左移或者右移的操作,给定的数和1进行与的操作,可以判断最后一位是1还是0,这样持续左移(右移)就可以判断有几个1了。
例如:
最后一位是1,则结果为1
00000000 00010000 00010000 00010001
& 00000000 00000000 00000000 00000001
= 00000000 00000000 00000000 00000001
最后一位是0,则结果为0
00000000 00010000 00010000 00010000
& 00000000 00000000 00000000 00000001
= 00000000 00000000 00000000 00000000
右移循环操作,主要是移动给定的原数字:
int hammingWeight(uint32_t n) {
for(int i = 0; i < 32; i++) {
count += (n >> i) & 1;
}
return count;
}
进阶方法
n & (n - 1)
的操作是将最后最后一位1变为0,利用这个性质,循环到全部1变为0。
例如:
n: 00000000 00010000 00010000 00010100
n-1: 00000000 00010000 00010000 00010011
n&(n - 1): 00000000 00010000 00010000 00010000
将每次的n&(n - 1)都赋值给n,当n变为0时则停止循环
class Solution {
public:
int hammingWeight(uint32_t n) {
int count = 0;
while(n != 0) {
n = n & (n - 1);
count++;
}
return count;
}
};