是否有类似于 JavaInteger.bitCount(int)
或Long.bitCount(long)
.NET Framework 中任何地方的方法?
(对于那些不熟悉这些 Java 方法的人)这也被称为:
- 汉明重量
- 人口计数(通常
POPCNT
在硬件中实现时调用。)
虽然在 网上可以找到很多 实现,但我想知道是否有标准库实现。
我知道这不在BitArray
,UInt32
或中BitConverter
,但也许在某个地方隐藏了一个版本,例如在加密函数中。
是否有类似于 JavaInteger.bitCount(int)
或Long.bitCount(long)
.NET Framework 中任何地方的方法?
(对于那些不熟悉这些 Java 方法的人)这也被称为:
POPCNT
在硬件中实现时调用。)虽然在 网上可以找到很多 实现,但我想知道是否有标准库实现。
我知道这不在BitArray
,UInt32
或中BitConverter
,但也许在某个地方隐藏了一个版本,例如在加密函数中。
BitVector32
和类都BitArray
没有这样的方法,所以我相信框架中确实缺少这种方法。
就个人而言,我认为这些类无论如何都不是真正有用的,因为它们错过了许多自然位操作。我不确定它们的真正用途。事实上,它们的用处非常有限。
此功能不在 .NET Framework 或 .NET Standard 中,但在 .NET Core 3.0 和更新版本中,因此包括 .NET 5.0 和更新版本,在System.Numerics.BitOperations
静态类下,特别是方法
两者都在 C# 中System.Int32
返回int
。
还有其他有用的操作:计算前导零或尾随零,计算以 2 为底的整数对数,以及执行位旋转(也称为循环移位)。
在核心库中这样做的最大好处/原因可能是您可以在不链接到非托管代码的情况下获得硬件加速,并且类文档证实了这一点:
为固有的位旋转操作提供实用方法。这些方法在底层平台上可用时使用硬件内在函数;否则,他们会使用优化的软件后备。
我知道这是一个非常古老的问题,但对于像我这样的人来说,至少有一个解决方法可能会有所帮助:
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;
}
这些方法基于 Hacker's Delight 的算法。您可以在此处下载它们的 C 代码。