我有一个函数,检查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 += 8;
:
value = 2;
如果我想第4位被设置过,我根据第4位的附加值
因此,值为10,第2位和第4位被设置。所以我把这些数字保存在我的班级中,而不是位数(8位数值,而不是4位数字,......)。 改变这个之后,我可以摆脱我不必要的功能,这是在顶部! 感谢您的帮助!
看一看[Integer.numberOfTrailingZeros(INT)(http://docs.oracle.com/javase /7/docs/api/java/lang/Integer.html#numberOfTrailingZeros(int)) – jlordo
为什么在所有的最大值为64位时通过'Integer.MAX_VALUE'完成迭代? –
下面是似乎试图回答的问题:_“如果我有值'n',并且想知道第m位是否已设置”_为什么不传递2'int'参数给功能?或者,你只是想弄清楚是否设置了_any_位?无论哪种方式,你都可以在一段时间内得到答案。 –