【发布时间】: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 位?无论哪种方式,您都可以在恒定时间内得到答案。 -
是的......你说得对,这给我带来了另一个问题,我是按数字设置位的,但我会在上面解释。你让我看到了我的思维错误! :)