16

是否有类似于 JavaInteger.bitCount(int)Long.bitCount(long).NET Framework 中任何地方的方法?

(对于那些不熟悉这些 Java 方法的人)这也被称为:

  • 汉明重量
  • 人口计数(通常POPCNT在硬件中实现时调用。)

虽然 网上可以找到很多 实现但我想知道是否有标准库实现

我知道这不在BitArray,UInt32或中BitConverter,但也许在某个地方隐藏了一个版本,例如在加密函数中。

4

4 回答 4

4

BitVector32和类都BitArray没有这样的方法,所以我相信框架中确实缺少这种方法。

就个人而言,我认为这些类无论如何都不是真正有用的,因为它们错过了许多自然位操作。我不确定它们的真正用途。事实上,它们的用处非常有限。

于 2011-05-06T10:42:34.240 回答
4

此功能不在 .NET Framework 或 .NET Standard 中,但在 .NET Core 3.0 和更新版本中,因此包括 .NET 5.0 和更新版本,在System.Numerics.BitOperations静态类下,特别是方法

两者都在 C# 中System.Int32返回int

还有其他有用的操作:计算前导零或尾随零,计算以 2 为底的整数对数,以及执行位旋转(也称为循环移位)。

在核心库中这样做的最大好处/原因可能是您可以在不链接到非托管代码的情况下获得硬件加速,并且类文档证实了这一点:

为固有的位旋转操作提供实用方法。这些方法在底层平台上可用时使用硬件内在函数;否则,他们会使用优化的软件后备。

于 2020-05-24T17:23:20.683 回答
3

我知道这是一个非常古老的问题,但对于像我这样的人来说,至少有一个解决方法可能会有所帮助:

public static int BitCount(int n)
{
    var count = 0;
    while (n != 0)
    {
        count++;
        n &= (n - 1); //walking through all the bits which are set to one
    }

    return count;
}
于 2020-06-08T14:49:37.263 回答
0

这些方法基于 Hacker's Delight 的算法。您可以在此处下载它们的 C 代码。

于 2011-05-06T10:47:43.590 回答