我有一个64位无符号整数,正好设置了1位.我想为每个可能的64个值分配一个值(在这种情况下,奇数素数,因此0x1对应于3,0x2对应于5,...,0x8000000000000000对应于313).
似乎最好的方法是转换1 - > 0,2 - > 1,4 - > 2,8 - > 3,...,2 ^ 63 - > 63并查找数组中的值.但即使如此,我也不确定获得二进制指数的最快方法是什么.并且可能还有更快/更好的方法.
此操作将使用10 14到10 16次,因此性能是一个严重的问题.
StackOverflow上有很多关于此的问题.很多.但是我找不到答案:
比...快:
private static int Obvious(ulong v)
{
int r = 0;
while ((v >>= 1) != 0)
{
r++;
}
return r;
}
Run Code Online (Sandbox Code Playgroud)
甚至
int r = (int)(Math.Log(v,2));
Run Code Online (Sandbox Code Playgroud)
我在这里假设一个64位Intel CPU.
一个有用的参考是Bit Hacks页面,另一个是fxtbook.pdf. 然而,虽然这些提供了解决问题的有用方向,但它们没有给出准备好的答案.
我正在使用一个可重用的函数,它只能为C#执行与_BitScanForward64和_BitScanReverse64类似的操作.
我正在为我的2D游戏创建一个世界生成器,该生成器使用Java中的Diamond-Square算法,并且听说它仅在2 n +1(幂)个数下有效(或至少有效)二)。
用调用生成世界的方法generateWorld(width, height),但是会产生问题。我希望能够输入a ,如果输入宽度不是width,该函数将找到最接近的数字,该数字是2的幂。我真的不知道该怎么做,因此非常感谢所有帮助!
总结:如果一个数不是2功率,我想找到最近的号码的那一个,这是二的幂。
我有一个整数输入,功率为2(1,2,4,8等).我希望函数在不使用log()的情况下返回位位置.例如,对于上面的输入,将分别返回{0,1,2,3}对于C#.如果这可以在SQL中完成.
谢谢!