Number of 1 Bits
Write a function that takes an unsigned integer and returns the number of ’1’ bits it has (also known as the Hamming weight).
Wrong Solution
public class NumberOfBits {
public static void main(String[] args) {
System.out.println(hammingWeight(1));
System.out.println(hammingWeight(11));
System.out.println(hammingWeight(10));
System.out.println(hammingWeight(4));
System.out.println(hammingWeight(8));
System.out.println(hammingWeight(3));
System.out.println(hammingWeight(0));
System.out.println(hammingWeight(Integer.MIN_VALUE));
}
// you need to treat n as an unsigned value
public static int hammingWeight(int n) {
int result = 0;
int i = 0;
while (n > 0) {
if ((n & (1 << i)) > 0) {
result++;
n = n ^ (1 << i);
}
i++;
}
return result;
}
}
Wrong Answer
Input:
2147483648 (10000000000000000000000000000000)
Output:
0
Expected:
1
题目说了是无符号数, 我以为第32位的bit就不会为0了
改正
把原来代码里的
>0
改为!=0
用
System.out.println(hammingWeight(Integer.MIN_VALUE));
来测试
2147483648 (10000000000000000000000000000000)
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int result = 0;
int i = 0;
while (n != 0) {
if ((n & (1 << i)) != 0) {
result++;
n = n ^ (1 << i);
}
i++;
}
return result;
}
}
其他解法
public static int hammingWeight(int n) {
int result = 0;
while (n != 0) {
result++;
n = n & (n - 1);
}
return result;
}
将 n & (n - 1) 得到的值赋给 n , 如果 非 0, 则表示bit 为1