count java中的1位数

问题描述 投票:4回答:3

我在做一个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中查看了整数的位表示但是仍然不知道解决方案的问题?谁能帮助我?

java bit
3个回答
4
投票

当你想要一个按位&时,问题是执行模数。就像是,

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

1
投票

Java使用了两个赞美。所以负位是最左边的位。这意味着如果您的数字大于Integer.MAX_VALUE,您的输入将为负数。当你做%2the标志保持不变。另一种方法是使用&1来改变符号位。在第一次迭代之后,您已经完成了一次移位,符号位将为零。


1
投票
public int hammingWeight(int n) {
    return Integer.bitCount(n);
}

Integer.bitCount(int i)

返回指定int值的二进制补码表示形式中的一位数。

© www.soinside.com 2019 - 2024. All rights reserved.