舍入到最接近的2的幂

时间:2010-12-09 13:30:35

标签: algorithm

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

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

8 个答案:

答案 0 :(得分:29)

接下来的两个更高的权力:见bit-twiddling hacks

在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++;

答案 1 :(得分:17)

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

对于java,可以这样做:

Math.ceil(Math.log(x)/Math.log(2))

答案 2 :(得分:6)

你的要求有点混淆,2到5的最接近的幂是4.如果你想要的是从数字开始的2的下一个幂,那么下面的 Mathematica 表达式就是你做的想:

2^Ceiling[Log[2, 5]] => 8

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

答案 3 :(得分:4)

对于给定整数x

的下一个2的幂

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

或者(如果您没有log函数接受 base 参数

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

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

答案 4 :(得分:4)

由于问题的标题是“舍入到最近的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;
}

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

答案 5 :(得分:2)

这可以通过右移输入数字直到它变为0并保持移位计数来完成。这将给出最重要的1位的位置。得到2这个数的幂将给我们下一个最接近的2的幂。

public int NextPowerOf2(int number) {
    int pos = 0;

    while (number > 0) {
        pos++;
        number = number >> 1; 
    }
    return (int) Math.pow(2, pos);
}

答案 6 :(得分:0)

为VBA修改。 NextPowerOf2_1似乎不起作用。所以我使用了循环方法。但需要一个向右移位的操作员。

Sub test()
    NextPowerOf2_1(31)
    NextPowerOf2_2(31)
    NextPowerOf2_1(32)
    NextPowerOf2_2(32)
End Sub

Sub NextPowerOf2_1(ByVal number As Long) ' Does not work
    Debug.Print 2 ^ (Int(Math.Log(number - 1) / Math.Log(2)) + 1)
End Sub

Sub NextPowerOf2_2(ByVal number As Long)
    Dim pos As Integer
    pos = 0
    While (number > 0)
        pos = pos + 1
        number = shr(number, 1)
    Wend

    Debug.Print 2 ^ pos
End Sub
Function shr(ByVal Value As Long, ByVal Shift As Byte) As Long
    Dim i As Byte
    shr = Value
    If Shift > 0 Then
        shr = Int(shr / (2 ^ Shift))
    End If
End Function

答案 7 :(得分:0)

要在Java中四舍五入到最接近的2的幂,可以使用它。可能比其他答案中提到的那些令人费解的东西要快得多。

static long roundUpToPowerOfTwo(long v) {
  long i = Long.highestOneBit(v);
  return v > i ? i << 1 : i;
}