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.
题目大意 输入一个无符号数,判断其二进制表示里有多少个1。
有一篇解析很好,摘录如下:
public static int hammingWeight(int n) {
int ones = 0;
while(n!=0) {
ones = ones + (n & 1);
n = n>>>1;
}
return ones;
}
- An Integer in Java has 32 bits, e.g. 00101000011110010100001000011010.
- To count the 1s in the Integer representation we put the input int
n in bit AND with 1 (that is represented as
00000000000000000000000000000001, and if this operation result is 1,
that means that the last bit of the input integer is 1. Thus we add it to the 1s count.
ones = ones + (n & 1);
- Then we shift the input Integer by one on the right, to check for the
next bit.
n = n>>>1;
We need to use bit shifting unsigned operation >>> (while >> depends on sign extension)
- We keep doing this until the input Integer is 0.
In Java we need to put attention on the fact that the maximum integer is 2147483647. Integer type in Java is signed and there is no unsigned int. So the input 2147483648 is represented in Java as -2147483648 (in java int type has a cyclic representation, that means Integer.MAX_VALUE+1==Integer.MIN_VALUE).
翻译:
在java中我们需要注意的一点是整数能表示最大的数是2147483647,另外整数在java中是有符号的而且不存在无符号的整数,所以,如果程序输入的是2147483648 ,那么由于java能表示的最大整数为2147483647,输入的2147483648 在java中表示的数值为-2147483648,补码表示即为1后面跟31个0。
java中数字是循环表示的,所以最大的正数加一为最小的负数。
n!=0
in the while condition and we cannot use
n>0
because the input 2147483648 would correspond to -2147483648 in java and the code would not enter the while if the condition is n>0 for n=2147483648.
另附解析一篇:
https://zhuanlan.zhihu.com/p/29187389
本文介绍了一种在Java中计算整数Hamming权重的方法,即计算无符号整数二进制表示中1的个数。文章详细解释了位操作和位移运算,并给出了一段清晰的示例代码。

412

被折叠的 条评论
为什么被折叠?



