【问题标题】:Get the position of a bit and if it is set获取位的位置以及是否设置
【发布时间】:2012-12-10 16:07:07
【问题描述】:

我有一个函数可以检查 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: 感谢您的支持。 cmets和答案使我犯了错误。我错误地设置了值,这使得它比需要的更复杂。我从来不擅长移位。 如果我想设置第二个位,我会这样设置值:

value = 2;

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

value += 8;

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

【问题讨论】:

  • 当你最多只有 64 位时,为什么要一直迭代 Integer.MAX_VALUE
  • 这是一个似乎试图回答的问题:“如果我有 n 的值,我想知道 mth 位是否已设置”为什么不将 2 个 int 参数传递给函数?或者,您是否只是想弄清楚是否设置了 any 位?无论哪种方式,您都可以在恒定时间内得到答案。
  • 是的......你说得对,这给我带来了另一个问题,我是按数字设置位的,但我会在上面解释。你让我看到了我的思维错误! :)

标签: java bit


【解决方案1】:

如果只有一个,您的代码总是返回最低位 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;
}

【讨论】:

  • 好吧……你让我想起了一些事情。不幸的是,你是对的,我的想法有误。我改变了整个事情。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
相关资源
最近更新 更多