Question:
Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming weight).
For example, the 32-bit integer ’11' has binary representation 00000000000000000000000000001011
, so the function should return 3.
Analyze:本题目考察的是二进制表示法中有几个1,首先想到的是一位一位向左移,与0x01进行按位与,得出1的个数。
public int hammingWeight (int n) {
int num = 0;
while (n != 0) {
if((n & 0x01) != 0) {
num++;
}
n = n << 1;
}
return num;
}
但此方法效率较低,对0x1fffffff需要运行32次才可以,而在LeetCode中执行超时。
可以换个思路:
n = 0x110100, n-1 = 0x110011, n&(n - 1) = 0x110000
n = 0x110000, n-1 = 0x101111, n&(n - 1) = 0x100000
n = 0x100000, n-1 = 0x011111, n&(n - 1) = 0x0
n = 0x110000, n-1 = 0x101111, n&(n - 1) = 0x100000
n = 0x100000, n-1 = 0x011111, n&(n - 1) = 0x0
上述算法中,有几个1就只需要执行几次。
public int hammingWeight(int n) {
int num = 0;
while(n!=0){
n=n&(n-1);
num++;
}
return num;
}