一尘不染

用于查找大于或等于给定值的两个最小幂的算法[重复]

algorithm

我需要找到两个大于或等于给定值的最小幂。到目前为止,我有这个:

int value = 3221; // 3221 is just an example, could be any number
int result = 1;

while (result < value) result <<= 1;

它工作正常,但有点天真。有没有针对该问题的更好算法?

编辑。有一些不错的汇编程序建议,因此我将这些标记添加到问题中。


阅读 152

收藏
2020-07-28

共1个答案

一尘不染

这是我的最爱。除了最初检查它是否无效(<0,如果知道只传递> =
0的数字可以跳过)之外,它没有循环或条件,因此它将胜过大多数其他方法。这类似于埃里克森的答案,但我认为我在开头减x并在结尾加1的方式比他的答案稍显尴尬(并且避免在结尾使用条件式)。

/// Round up to next higher power of 2 (return x if it's already a power
/// of 2).
inline int
pow2roundup (int x)
{
    if (x < 0)
        return 0;
    --x;
    x |= x >> 1;
    x |= x >> 2;
    x |= x >> 4;
    x |= x >> 8;
    x |= x >> 16;
    return x+1;
}
2020-07-28