舍入值为最接近的2的幂

MaT*_*MaT 1 c#

我正在寻找C#中最快的方法来将值舍入到最接近的2的幂.我发现如果使用像这样的按位运算符,最好的方法是将值舍入到下一个2的幂.

int ToNextNearest(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;
}
Run Code Online (Sandbox Code Playgroud)

但是这给了下一个最近的而不是最近的,我想只有最近的2的幂.这是一种简单的方法.

int ToNearest(int x)
{
    Math.Pow(2, Math.Round(Math.Log(x) / Math.Log(2)));
}
Run Code Online (Sandbox Code Playgroud)

但是,是否有更好的优化版本找到最接近的两个值?

非常感谢.

joh*_*ohn 7

当然最好的方法是使用你的按位例程来找到下一个2的幂,然后将结果除以2.这为您提供了之前的两个幂.然后一个简单的比较将告诉你哪两个更接近.

int ToNearest(int x)
{
  int next = ToNextNearest(x);
  int prev = next >> 1;
  return next - x < x - prev ? next : prev;
}
Run Code Online (Sandbox Code Playgroud)

未经测试的代码,但你明白了.