.NET相当于Java的Integer.bitCount?

fin*_*nnw 15 .net java bit-manipulation hammingweight

是否有类似于Java的方法Integer.bitCount(int)Long.bitCount(long).NET Framework中的任何位置?

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

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

虽然 很多 实现 ,以 发现在网络上,我在想,如果有一个标准库的实现.

我知道这不在BitArray,UInt32或者BitConverter,但也许有一个版本隐藏在某处,例如在加密功能中.

kbo*_*ino 5

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

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

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

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

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


Dan*_*l B 5

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

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;
}
Run Code Online (Sandbox Code Playgroud)


Kon*_*lph 4

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

\n\n

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

\n

  • 对于有效实现哈希数组映射 trie 很有用:http://en.wikipedia.org/wiki/Hash_array_mapped_trie (2认同)
  • @Kevman我认为协议是基于这样一个事实:.NET 类是无用的,而不是位计数方法。 (2认同)