题目链接
本题可以利用32位int,写循环右移32次来做,但是我觉得更自然的方法是以下两种。
1. 利用无符号右移
Java没有无符号整型,但是利用>>>
可以实现无符号右移,即不论符号位是1还是0,统一在左侧补0。
public class Solution {
public int hammingWeight(int n) {
int count = 0;
while (n != 0) {
count += (n & 1);
n >>>= 1;
}
return count;
}
}
利用n&(n-1) trick
规律是,当执行n = n & (n - 1)
时,就能去掉n中最右侧的1。借用一下官方题解的图:
public int hammingWeight(int n) {
int sum = 0;
while (n != 0) {
sum++;
n &= (n - 1);
}
return sum;
}