快速找到2的最近上方指数的指数

And*_*man 21 java performance

如果我有一个数字a,我希望x的值在b = 2 ^ x,其中b是2的下一个幂大于a.

如果您错过了标记,那么这是Java,而a是一个int.我正在寻找最快的方法来做到这一点.我的解决方案就是使用bit-twiddling来获取b,然后执行(int)(log(b)/ log(2)),但我觉得必须有一个更快的方法,不涉及划分两个浮动 -点数.

Jer*_*ock 36

怎么样a == 0 ? 0 : 32 - Integer.numberOfLeadingZeros(a - 1)?这完全避免了浮点数.如果你知道a从不0,你可以不用第一部分.

  • `32` - >`Integer.SIZE` (4认同)

xba*_*esx 11

如果有人正在寻找Andy提到的一些"苦涩"的代码,那可能看起来像这样:(如果人们有更好的方法,你应该分享!)

    public static int nextPowerOf2(final int a)
    {
        int b = 1;
        while (b < a)
        {
            b = b << 1;
        }
        return b;
    }
Run Code Online (Sandbox Code Playgroud)

  • 投反对票。没有回答问题。问题是:“我想要 b=2^x 中 x 的值,其中 b 是大于或等于 a 的下一个 2 次方。” (请参阅OP对“大于或等于”部分的评论。)这个答案产生b,而不是x。 (2认同)

Chi*_*ral 7

不一定更快,但一个班轮:

int nextPowerOf2(int num)
{
    return num == 1 ? 1 : Integer.highestOneBit(num - 1) * 2;
}
Run Code Online (Sandbox Code Playgroud)