https://leetcode.cn/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/
解法一:循环遍历二进制位
不断的将n对应的二进制数的最右边的一位&1,如果与的结果是1,说明遇到一个1,否则是0,不断右移,直到n变为0, java中对应无符号右移>>>
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int cnt=0;
while(n!=0){
cnt+=n&1;
n>>>=1;
}
return cnt;
}
}
//O(k) k=32
//O(1)
class Solution {
public:
int hammingWeight(uint32_t n) {
int cnt=0;
while(n!=0){
cnt+=(n&1);
n>>=1;
}
return cnt;
}
};
class Solution:
def hammingWeight(self, n: int) -> int:
cnt=0
while n!=0:
cnt+=(n&1)
n>>=1
return cnt
解法二:利用n&(n-1)
n&(n-1)可以将n对应的二进制位的最右边的1变成0, 能进行多少次n&(n-1)操作就说明有多少个1
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int cnt=0;
while(n!=0){
cnt+=1;
n=n&(n-1);
}
return cnt;
}
}
//O(k) k=32
//O(1)
class Solution {
public:
int hammingWeight(uint32_t n) {
int cnt=0;
while(n!=0){
cnt+=1;
n&=(n-1);
}
return cnt;
}
};
class Solution:
def hammingWeight(self, n: int) -> int:
cnt=0
while n!=0:
cnt+=1
n=n&(n-1)
return cnt