2012-12-10 39 views
0

我有一个函数,检查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位数字,......)。 改变这个之后,我可以摆脱我不必要的功能,这是在顶部! 感谢您的帮助!

+0

看一看[Integer.numberOfTrailingZeros(INT)(http://docs.oracle.com/javase /7/docs/api/java/lang/Integer.html#numberOfTrailingZeros(int)) – jlordo

+1

为什么在所有的最大值为64位时通过'Integer.MAX_VALUE'完成迭代? –

+0

下面是似乎试图回答的问题:_“如果我有值'n',并且想知道第m位是否已设置”_为什么不传递2'int'参数给功能?或者,你只是想弄清楚是否设置了_any_位?无论哪种方式,你都可以在一段时间内得到答案。 –

回答

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; 
} 
+0

好吧......你只是想起了一些事情。不幸的是你是对的,我的思维错误。 我改变了整个事情。谢谢! – DonMarco