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

时间:2020-05-08 06:07:12

标签: java

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

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

 1 -> 0
 2 -> 1
 4 -> 2
 8 -> 3
16 -> 4
32 -> 5
..etc...

我当然可以构建一个数组或一个字典(键是数字,值是bit#)……说16个索引,以从值到bit#

我也可以做

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

但是还有其他更花哨的方式吗?

4 个答案:

答案 0 :(得分:3)

没什么好看的,java.lang.Integer类提供的东西(尽管实现有些花哨):

int lowestOneBit = Integer.numberOfTrailingZeros(needed_value);

答案 1 :(得分:2)

2 ^ x = y 时, log 2 (y)= x 。您知道 y ,所以解决方案是:

Math.log(y) / Math.log(2)

这是因为 log b (a)= log(a)/ log(b)

答案 2 :(得分:0)

您可以找到整数的第一个有效位:

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();
}

答案 3 :(得分:0)

递归如何!

Current: 
<div class="bar">
  <div class="progress" style="width: 50%">
    <span>50</span>
  </div>
</div>
Expected
<div class="bar2">
  <div class="progress" style="width: 50%">
    <span>50</span>
  </div>
</div>