题目描述
思路
(n - 1): 二进制数字 n 最右边的 1变成 0 ,此 1右边的 0 都变成 1 。
n & (n - 1): 二进制数字 n最右边的 1 变成 0 ,其余不变。
此解依靠不断使最右边的1变成0,直到n等于0之前,改变了多少次就有多少个1
补充位运算知识点:
(n&1)==1:n为奇数
n>>1:右移一位,相当于除以2向上取整
代码
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int i=0;
while(n>0){
n&=(n-1);
i+=1;
}
return i;
}
}