我正在寻找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)
但是,是否有更好的优化版本找到最接近的两个值?
非常感谢.
当然最好的方法是使用你的按位例程来找到下一个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)
未经测试的代码,但你明白了.