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