Java中Integer.bitCount的.NET等效方法是什么?

16

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

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

  • 汉明重量
  • 种群计数(当其在硬件中实现时通常称为POPCNT)。

虽然可以在网络上找到很多实现,比如这里这里这里这里这里这里这里,但我想知道是否有标准库实现。

我知道这不在BitArrayUInt32BitConverter中,但也许有一个版本被隐藏在某个地方,比如在加密函数中。

4个回答

5
这个功能不在.NET Framework和.NET Standard中,但在.NET Core 3.0及更高版本中,包括.NET 5.0及更高版本,在System.Numerics.BitOperations静态类中,尤其是以下方法: 这两个方法都返回System.Int32,也就是C#中的int
此外,还有其他有用的操作:计算前导或尾随零、计算整数的基于2的对数和执行位旋转(也称为循环移位)。
在核心库中使用这些操作的最大好处可能是可以获得硬件加速,而无需链接到非托管代码。类文档也证实了这一点:

提供用于固有位操作的实用方法。当底层平台上可用硬件固有位时,这些方法使用硬件固有位;否则,它们使用经过优化的软件后备方案。


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;
}

4
没有发现 BitVector32BitArray 类中有这个方法,因此我认为这个方法确实在框架中缺失了。
个人认为,这些类并不是很有用,因为它们缺少许多自然的位运算。我不确定它们真正的用途是什么。就目前而言,它们的实用性非常有限。

2
用于哈希数组映射树的高效实现:http://en.wikipedia.org/wiki/Hash_array_mapped_trie - David Grenier
@David 我的抱怨是这两个类的接口设计很差。当然你可以用它们来开发某些东西,但你也可以使用一个普通的位向量(int)来完成同样的工作。一个合适的接口会让这些类型更加有用。 - Konrad Rudolph
@gjsduarte 如果你在面试中遇到一个可以通过 bitCount() 轻松解决的问题,你可能会改变主意...(显然,面试官认为这个方法存在于 .NET 中) - Kevman
2
@Kevman 我认为协议是关于 .NET 类是无用的事实,而不是一个位计数方法。 - Konrad Rudolph

0

这些方法基于《Hacker's Delight》中的算法。您可以在此处下载它们的C代码。


正如问题所述,我可以下载许多方法来完成工作。但问题特别涉及标准库方法。Java有这些方法,我认为.NET没有(但我希望被证明是错误的)。 - finnw
是的,我知道有很多实现。鉴于这个源代码,这是我所知道的最接近库的东西了。 - Nathan Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接