在 StackOverflow 上有很多关于这个的问题。 很多。但是我找不到这样的答案:
- 使用 C#
- 适用于 64 位整数(相对于 32 位)
快于:
private static int Obvious(ulong v)
{
int r = 0;
while ((v >>= 1) != 0)
{
r++;
}
return r;
}
甚至
int r = (int)(Math.Log(v,2));
我在这里假设 64 位 Intel CPU。
一个有用的引用是 Bit Hacks page另一个是 fxtbook.pdf 然而,虽然这些提供了解决问题的有用方向,但它们并没有给出现成的答案。
我正在寻找一个可重复使用的函数,它可以执行类似于 _BitScanForward64 的操作和 _BitScanReverse64仅适用于 C#。
最佳答案
添加了 .NET Core 3.0 BitOperations.LeadingZeroCount和 BitOperations.TrailingZeroCount所以你可以直接使用它们。它们将映射到 x86 的 LZCNT/BSR 和 TZCNT/BSF 指令,因此非常高效
int mostSignificantPosition = 63 - BitOperations.LeadingZeroCount(0x1234L);
int leastSignificantPosition = BitOperations.TrailingZeroCount(0x1234L);
或者最高有效位的位置可以这样计算
int mostSignificantPosition = BitOperations.Log2(x - 1) + 1
关于c# - 在 64 位整数中查找最高和最低有效位集的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31374628/