我在做一个leetcode问题时遇到了一个奇怪的问题。这是关于Java中的位表示。
编写一个取无符号整数的函数,并返回它所具有的“1”位数(也称为汉明权重)。
例如,32位整数'11'具有二进制表示00000000000000000000000000001011,因此该函数应返回3。
我的解决方案是
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int count = 0;
for(int i = 0; i < 32; ++i){
if((n >>> i) % 2 == 1){
++count;
}
}
return count;
}
}
由于输入大小写,因此不接受此代码:
4294967295 (11111111111111111111111111111111)
我在java中查看了整数的位表示但是仍然不知道解决方案的问题?谁能帮助我?
当你想要一个按位&
时,问题是执行模数。就像是,
public static int hammingWeight(int n) {
int count = 0;
for (int i = 0; i < 32; ++i) {
if (((n >>> i) & 1) == 1) {
++count;
}
}
return count;
}
public static void main(String[] args) {
int c = -1;
System.out.println(hammingWeight(c));
}
产出(如预期)
32
Java使用了两个赞美。所以负位是最左边的位。这意味着如果您的数字大于Integer.MAX_VALUE
,您的输入将为负数。当你做%2
the标志保持不变。另一种方法是使用&1
来改变符号位。在第一次迭代之后,您已经完成了一次移位,符号位将为零。
public int hammingWeight(int n) {
return Integer.bitCount(n);
}
返回指定int值的二进制补码表示形式中的一位数。