簡體   English   中英

.NET 相當於 Java 的 Integer.bitCount?

[英].NET equivalent of Java's Integer.bitCount?

在 .NET Framework 的任何地方是否有類似於 Java 的Integer.bitCount(int)Long.bitCount(long)

(對於那些不熟悉這些 Java 方法的人)這也稱為:

  • 漢明重量
  • 人口計數(在硬件中實現時通常稱為POPCNT 。)

雖然很多實現,以發現在網絡上,我在想,如果有一個標准庫的實現。

我知道這不在BitArrayUInt32BitConverter ,但也許某處隱藏了一個版本,例如在加密函數中。

BitVector32BitArray類都沒有這樣的方法,所以我相信框架中確實缺少這種方法。

就個人而言,我認為這些類並沒有真正有用,因為它們錯過了許多自然位操作。 我不確定它們的真正用途是什么。 事實上,它們的用處非常有限。

此功能不在 .NET Framework 或 .NET Standard 中,但在 .NET Core 3.0 和更高版本中,因此包括 .NET 5.0 和更高版本,在System.Numerics.BitOperations靜態類下,特別是方法

兩者都在 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;
}

這些方法基於 Hacker's Delight 的算法。 您可以在此處下載它們的 C 代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM