c# - 在 64 位整数中查找最高和最低有效位集的快速方法

标签 c# x86 bit-manipulation leading-zero

在 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.LeadingZeroCountBitOperations.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/

相关文章:

c# - 之间的区别!和 ~ 在 C# 中

c# - RuntimeTypeHandle 和 Type 有什么区别?

c++ - 我们需要多少个内存屏障来实现 Peterson 锁?

c# - 按位比较两个枚举以获得单个 True 结果?

python - 努力理解 python 中的按位运算符

c# - 如何在 C# Winform 中锁定应用程序 GUI

c# - 使用不显眼的 javascript/MVC3 和 DataAnnotations 验证电子邮件地址

assembly - x86 指令 "call dword ptr ds:[00923030h]"是什么意思?

c++ - 在嵌入式 x86 程序集中添加数组?

algorithm - 二进制数字游戏之美