0

我有一个函数可以检查是否设置了 int 中的某个位。但我认为会有一个更快的实现,因为这个是线性的,不能是最有效的,虽然我知道 int 应该在 1 到 1024 之间。

 public static int getBitPos(final int n) {
        if (Integer.bitCount(n) != 1)
            return Constants.UNDEFINED;
        else {
            for (int i = 0; i < Integer.MAX_VALUE; ++i) {
                if (testBit(n, i))
                    return i;
            }
        }
        return Constants.UNDEFINED;
    }

testBit以下标准函数在哪里:

public static boolean testBit(final int n, final int pos) {
    int mask = 1 << pos;
    return (n & mask) == mask;
}

但是桅杆有更快的方法,不是吗?如果我有值 17 并且我想知道是否设置了第 4 位(n = 8)?应该有一种更快的方法来检查是否设置了 n=8 的位...

希望你能帮我...

编辑1: 感谢您的支持。评论和答案使我误入歧途。我错误地设置了值,这使得它比需要的更复杂。我从来不擅长移位。如果我想设置第二位,我会这样设置值:

value = 2;

如果我也想设置第 4 位,我根据第 4 位添加值:

value += 8;

所以值为 10,并设置了第 2 位和第 4 位。因此,我将数字保存在班级中,而不是位位置(8 作为值,而不是 4 用于第 4 位,...)。更改此设置后,我可以摆脱不必要的功能,这太过分了!感谢大家的帮助!

4

1 回答 1

5

如果只有一个,您的代码总是返回最低位 1。你可以通过这样做来达到同样的目的:

int foo = whatever;
int lowestSetBit = Integer.numberOfTrailingZeros(foo) + 1;

你的代码是

public static int getBitPos(final int n) {
    if (Integer.bitCount(n) == 1)
        return Integer.numberOfTrailingZeros(n) + 1;
    return Constants.UNDEFINED;
}
于 2012-12-10T16:15:32.277 回答