.NET相当于Java的Integer.bitCount?

时间:2011-05-06 10:38:00

标签: java .net bit-manipulation hammingweight

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

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

  • Hamming Weight
  • 人口计数(在硬件中实施时通常称为POPCNT。)

虽然在网络上找到了there are plenty of implementations to be,但我想知道是否有标准库实现。

我知道这不在BitArrayUInt32BitConverter中,但也许某个地方隐藏了某个版本,例如在加密功能中。

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

该功能(不幸地)不在.NET Framework中,也没有使其成为.NET Standard,但在.NET Core 3.0及更高版本中,它是System.Numerics.BitOperations静态类下的,尤其是方法中

两者都在C#中返回System.Int32int

还有其他有用的操作:计算前零或后零,计算整数以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代码。