【问题标题】:.NET equivalent of Java's Integer.bitCount?.NET 相当于 Java 的 Integer.bitCount?
【发布时间】:2011-08-20 02:09:53
【问题描述】:

.NET Framework 中的任何地方是否有类似于 Java 的 @987654321@@987654322@ 的方法?

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

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

虽然在网上找到了thereareplentyofimplementationstobe,但我想知道是否有标准库实现。

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

【问题讨论】:

    标签: java .net bit-manipulation hammingweight


    【解决方案1】:

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

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

    【讨论】:

    • 有助于高效实现哈希数组映射的特里:en.wikipedia.org/wiki/Hash_array_mapped_trie
    • @David 我的抱怨是这两个类的接口设计不佳。当然,您可以使用它们来开发某些东西,但您也几乎可以使用普通位向量 (int)。一个合适的接口会让类型变得更有用。
    • @gjsduarte 如果您在求职面试中遇到可以使用 bitCount() 轻松解决的问题,您可能会改变主意....(显然面试自己认为这种方法存在于 .NET 中)
    • @Kevman 我认为协议是针对 .NET 类无用这一事实,而不是位计数方法。
    【解决方案2】:

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

    两者都在 C# 中返回 System.Int32 aka int

    还有其他有用的操作:计算前导零或尾随零,计算以 2 为底的整数对数,以及执行位旋转,即循环移位。

    在核心库中这样做的最大好处/原因可能是您可以在不链接到非托管代码的情况下获得硬件加速,并且类文档证实了这一点:

    为固有的位旋转操作提供实用方法。这些方法在底层平台上可用时使用硬件内在函数;否则,他们会使用优化的软件后备。

    【讨论】:

      【解决方案3】:

      我知道这是一个非常古老的问题,但对于像我这样的人来说,至少有一个解决方法可能会有所帮助:

      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】:

        这些方法基于 Hacker's Delight 的算法。你可以为他们下载C代码here

        【讨论】:

        • 正如问题中提到的,我可以下载来完成这项工作的方法并不缺乏。这个问题专门关于标准库方法。 Java 有它们,我认为 .NET 没有(但我希望被证明是错误的。)
        • 是的,我知道有很多实现。不过,考虑到来源,这与我所知道的图书馆一样接近。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-04
        • 2016-03-06
        • 1970-01-01
        • 2010-09-25
        • 2012-06-16
        • 1970-01-01
        相关资源
        最近更新 更多