Java-如何从给定值中获取位号(索引)?

Java-如何从给定值中获取位号(索引)?,java,Java,我有一个单一的数字,它是2的保证幂(1,2,4,8,16等等)。 如何从这个数字中获取“位索引” 比方说,我得到了数字“8”->我寻求的答案是“3”(位#3) 当然,我可以构建一个数组或字典(键是数字,值是位#)。。。假设16个索引从值到位# 我也可以做一个 int i = 0, counter = 1; while (counter != needed_value) { counter *= 2; i++; } // now "i" contains my bit# 但是有没

我有一个单一的数字,它是2的保证幂(1,2,4,8,16等等)。 如何从这个数字中获取“位索引”

比方说,我得到了数字“8”->我寻求的答案是“3”(位#3)

当然,我可以构建一个数组或字典(键是数字,值是位#)。。。假设16个索引从值到位#

我也可以做一个

int i = 0, counter = 1;
while (counter != needed_value) {
    counter *= 2;
    i++;
}
// now "i" contains my bit#

但是有没有。。。更奇特的方法?

您只需找到整数中的第一个有效位:

public static Optional<Integer> getFirstSignificantBit(int src) {
    for (int i = 0; i < 32; i++) {
        if ((src & 1) == 1) {
            return Optional.of(i);
        }
        src >>= 1;
    }

    return Optional.empty();
}
public静态可选getFirstSignifictBit(int src){
对于(int i=0;i<32;i++){
如果((src&1)==1){
第(i)项的可选择返回;
}
src>>=1;
}
返回可选的.empty();
}

没什么特别的,只是
java.lang.Integer
类提供的(尽管实现有些特别):

当2^x=y时,则log2(y)=x。你知道y,所以解决方案是:

Math.log(y)/Math.log(2)
这是因为logb(a)=log(a)/log(b)。

递归怎么样

  private static int bitIndex(int n) {
        if (n <= 1)
            return 0;
        return 1 + bitIndex(n/2);
    }
私有静态int-bitIndex(int-n){

如果(我想你只是在寻找这个数字的2底对数…对吗?…也许?…看起来有点不确定这意味着什么?看起来不错-非常感谢-没有意识到这一点!是的…看看实现…哇:)@Grisgram
Integer
类有几个这样有用的宝石-看看
highestOneBit()
lowstonebit()
bitCount()
reverseBytes(),
reverseBytes()
谢谢-是的,我明白了-有一些有趣的事情(reverseBytes!)可以帮上大忙
int lowestOneBit = Integer.numberOfTrailingZeros(needed_value);
  private static int bitIndex(int n) {
        if (n <= 1)
            return 0;
        return 1 + bitIndex(n/2);
    }