.NET Framework中是否有类似于Java的Integer.bitCount(int)
或Long.bitCount(long)
的方法?
(对于那些不熟悉这些Java方法的人),这也称为:
POPCNT
。)虽然在网络上找到了there are plenty of implementations to be,但我想知道是否有标准库实现。
我知道这不在BitArray
,UInt32
或BitConverter
中,但也许某个地方隐藏了某个版本,例如在加密功能中。
答案 0 :(得分:4)
BitVector32
和BitArray
类都没有这样的方法,所以我相信框架中确实缺少这种方法。
就个人而言,我认为这些类无论如何都没有用,因为它们错过了许多自然位操作。我不确定它们的用途是什么。实际上,它们的用处非常有限。
答案 1 :(得分:1)
该功能(不幸地)不在.NET Framework中,也没有使其成为.NET Standard,但在.NET Core 3.0及更高版本中,它是System.Numerics.BitOperations
静态类下的,尤其是方法中>
两者都在C#中返回System.Int32
或int
。
还有其他有用的操作:计算前零或后零,计算整数以2为底的对数,以及执行位旋转(也称为循环移位)。
在核心库中这样做的最大可能/原因是无需链接到非托管代码即可获得硬件加速,并且类文档确认了这一点:
提供用于固有位旋转操作的实用程序方法。这些方法在底层平台上可用时使用硬件内在函数。否则,他们将使用优化的软件后备。
答案 2 :(得分:1)
我知道这是一个非常老的问题,但是对于像我这样的人至少有一个解决方法可能会有所帮助:
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;
}
答案 3 :(得分:0)
这些方法基于Hacker's Delight的算法。您可以为他们here下载C代码。