获取位置,如果已设置

时间:2012-12-10 16:07:08

标签: java bit

我有一个函数可以检查是否设置了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,......)。 改变这一点后,我可以摆脱我不必要的功能,这是超过顶部! 谢谢大家的帮助!

1 个答案:

答案 0 :(得分: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;
}