16

Integer.bitCount(int)JavaまたはLong.bitCount(long).NETFrameworkのどこかに似た方法はありますか?

(これらのJavaメソッドに慣れていない人のために)これは、次のようにも知られています。

  • ハミング重み
  • 人口数(POPCNTハードウェアに実装されている場合によく呼び出されます)。

Webに たくさん 実装 ありますが、標準ライブラリの実装があるのではないかと思いました。

私はこれが、、またはにないことを知っていますがBitArrayUInt32おそらくBitConverter暗号関数などのどこかに隠されたバージョンがあります。

4

4 に答える 4

4

どちらのBitVector32クラスBitArrayにもそのようなメソッドがないので、このメソッドは実際にフレームワークから欠落していると思います。

個人的には、これらのクラスは多くの自然なビット演算を見逃しているため、とにかくあまり役​​に立ちません。それらが本当に何を意図しているのかわかりません。現状では、その有用性は非常に限られています。

于 2011-05-06T10:42:34.240 に答える
4

この機能は、.NETFrameworkにも.NETStandardにもありませんが、.NET Core 3.0以降、つまりSystem.Numerics.BitOperations静的クラス、特にメソッドの下にある.NET5.0以降に含まれています。

どちらもC#でSystem.Int32別名を返します。int

他にも便利な操作があります。先頭または末尾のゼロをカウントし、2を底とする整数の対数を計算し、ビットローテーション(循環シフト)を実行します。

コアライブラリでこれを行う最大の利点/理由は、アンマネージコードにリンクせずにハードウェアアクセラレーションを取得できることです。クラスのドキュメントでこれを確認しています。

本質的なビットをいじる操作のためのユーティリティメソッドを提供します。メソッドは、基盤となるプラットフォームで利用可能な場合、ハードウェア組み込み関数を使用します。それ以外の場合は、最適化されたソフトウェアフォールバックを使用します。

于 2020-05-24T17:23:20.683 に答える
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;
}
于 2020-06-08T14:49:37.263 に答える
0

これらのメソッドは、Hacker'sDelightのアルゴリズムに基づいています。ここからそれらのCコードをダウンロードできます。

于 2011-05-06T10:47:43.590 に答える