是否有一行表达式(可能是布尔值)来获取给定整数的最近2^n
个数字?
示例:5,6,7必须为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^(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;
}