舍入到最接近的2的幂

abb*_*bbs 25 algorithm

是否有一行表达式(可能是布尔值)来获取2^n给定整数的最近数字?

示例:5,6,7必须为8.

Jas*_*n S 31

四舍五入到下一个更强大的力量:看看有点笨拙的黑客.

在C:

unsigned int v; // compute the next highest power of 2 of 32-bit v

v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v++;
Run Code Online (Sandbox Code Playgroud)

  • 因为它递减,然后将低于其最高有效位的所有位设置为1,然后递增. (2认同)
  • 顺便说一下,你可以在最后右移一个地方,以获得下一个最低功率2. (2认同)

Ank*_*sal 17

我认为你的意思是接近2 ^ n的数字.您可以登录模式2,然后确定其中的下一个整数值.

对于java,可以这样做:

Math.ceil(Math.log(x)/Math.log(2))
Run Code Online (Sandbox Code Playgroud)

  • Python 版本:`from math import ceil, log; 最接近 = lambda x: int(ceil(log(x) / log(2)))` (2认同)

Hig*_*ark 6

您的要求有点混乱,最接近的2到5的幂是4.如果您想要的是从数字开始的2的下一个幂,那么下面的Mathematica表达式可以满足您的需求:

2^Ceiling[Log[2, 5]] => 8
Run Code Online (Sandbox Code Playgroud)

从中可以直截了当地找出大多数编程语言中的单线程.


El *_*oco 6

对于给定整数的下一个二的幂x

2^(int(log(x-1,2))+1)

或者(如果您没有log接受基本参数的函数

2^(int(log(x-1)/log(2))+1)

请注意,这不适用于 x < 2


maf*_*aff 5

由于问题的标题是“四舍五入到最接近的2”,因此我认为也包括解决该问题的方法将很有用。

int nearestPowerOfTwo(int n)
{
    int v = n; 

    v--;
    v |= v >> 1;
    v |= v >> 2;
    v |= v >> 4;
    v |= v >> 8;
    v |= v >> 16;
    v++; // next power of 2

    int x = v >> 1; // previous power of 2

    return (v - n) > (n - x) ? x : v;
}
Run Code Online (Sandbox Code Playgroud)

它基本上会找到前一个和下一个2的幂,然后返回最接近的1。

  • 先计算v然后对x使用x = v &gt;&gt; 1会更有效吗? (3认同)
  • 你说得太对了。我将您的建议纳入我的答案中。谢谢 (2认同)