.NET等价于Java';s Integer.bitCount?

.NET等价于Java';s Integer.bitCount?,java,.net,bit-manipulation,hammingweight,Java,.net,Bit Manipulation,Hammingweight,在.NET框架的任何地方都有类似于Java的或的方法吗 (对于不熟悉这些Java方法的人)这也称为: 人口计数(在硬件中实现时通常称为POPCNT) 虽然可以在web上找到,但我想知道是否有标准的库实现 我知道这不在BitArray、UInt32或BitConverter中,但可能在某个地方隐藏了一个版本,例如在加密函数中。或类都没有这样的方法,因此我相信该方法确实在框架中缺失 就我个人而言,我认为这些类并不是真的有用,因为它们错过了许多自然的位操作。我不确定它们的真正用途。事实上,它们的

在.NET框架的任何地方都有类似于Java的
的方法吗

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

  • 人口计数(在硬件中实现时通常称为
    POPCNT
虽然可以在web上找到,但我想知道是否有标准的库实现

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

或类都没有这样的方法,因此我相信该方法确实在框架中缺失


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

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

此功能不在.NET Framework或.NET标准中,但在.NET Core 3.0及更高版本中,因此在静态类下包括.NET 5.0及更高版本,尤其是方法

  • ,
它们都返回C#中的
System.Int32
aka
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;
}

正如问题中提到的,我可以下载很多方法来完成这项工作。这个问题是关于标准库方法的。Java有它们,我不认为.NET有(但我希望被证明是错误的。)是的,我知道有很多实现。尽管如此,这与我所知道的一个库非常接近,因为它的源代码。对于高效实现哈希数组映射的trie非常有用:@David我的抱怨是这两个类的接口设计得很糟糕。当然,您可以使用它们来开发某些东西,但也可以使用普通位向量(
int
)。一个合适的接口会使类型更有用。@gjsduarte如果在求职面试中遇到一个可以用bitCount()轻松解决的问题,你可能会改变主意。…(显然面试者自己认为.NET中存在这种方法)@Kevman我认为协议是针对.NET类无用这一事实,并不是说一个位计数方法是可行的。