0

いくつかのカテゴリを持つアプリケーションに取り組んでいます。目的は、カテゴリを値に格納することです。
まず、それらを int に格納することにしました。
カテゴリ : 0、1、2、3...
次に、ビットマスク操作を実行して、選択されたカテゴリを見つけます。
しかし、問題は、この int である 31 個のカテゴリを超えて保存できないことです。

そのようなシステムを作る方法はありますか? 無制限の数のカテゴリをスローしたくありませんが、64 を超える
可能性があります。ターゲット言語は C# ですが、他のソリューションでも問題ありません。

どうもありがとう !

4

4 に答える 4

2

任意長のビット配列であるSystem.Collections.BitArrayの使用を検討してください。積集合 (AND)、和集合 (OR)、および補数 (NOT) を実行できます。

整数をキーとする 32 を超えるカテゴリを使用できるようになりました。

public static class Categories
{
   public const int Category1 = 1;
   public const int Category2 = 2;
    //...
   public const int Category3123 = 3123;
   public const int Max = 5000;
}

BitArray myBitset = new BitArray((int)Categories.Max);
myBitSet.Set(Categories.Category1);
myBitSet.Set(Categories.Category4);

BitArray を使用するときに必要なすべての int へのキャストを避けるために、enum ではなく int を使用しましたが、これらをカテゴリを処理するクラスにカプセル化できることは明らかです。

于 2013-02-26T10:53:10.670 に答える
1

あなたの質問を正しく理解しているかどうかわからないので、ここに2つの答えがあります:

オブジェクトを分類したいが、一度に1 つのカテゴリしか保持できない場合は、カテゴリ番号を int に格納するだけで完全に選択できます。ビットマスキングは必要ありません。

特定のオブジェクトに対してすべてtrue または false である必要があるさまざまなフラグ/カテゴリ/オプションを保存する場合は、より長いビットマスクを使用する必要があります。ブール値の配列は良い考えです-値を取得して設定するためにビット操作を行う必要はありません.コンパイラはスペースの使用を最適化するのが最善だと確信しています.多くのbool変数を作成すると、それらは実際には可能な限り最小限のスペースに詰め込まれます。)とにかく、64ビットのlong、またはBigIntegerでさえも独自の実装をいつでも選択できます-桁数は無制限です。 1*10^x に設定します。ここで、x はアクセスしたい最大ビット位置の番号です。

于 2013-02-26T11:00:50.777 に答える
0

なぜここでビットマスクを使用しているのですか? ストレージの効率性に関する包括的な懸念事項はありますか? それ以外の場合HashSetは、カテゴリを使用してください。

概念的には、ビット セットと従来のセット コンテナーは同じです。ビット セットは、特別なパフォーマンス特性を持つ特定の実装です。

于 2013-02-26T11:04:44.623 に答える
0

次のようにカテゴリを定義すると:

public enum Categories
{
    Category1 = 0x0001,
    Category2 = 0x0002,
    Category3 = 0x0004,
    Category4 = 0x0008,
    Category5 = 0x000F,
    Category6 = 0x0010,
    Category7 = 0x0020,
    Category8 = 0x0040,
    // etc...
}

次に、次のように使用できます。

var myCategories = Categories.Category1 | Categories.Category4;

if(myCategories | Categories.Category1 > 0)
{
    // do something for category 1....
}
于 2013-02-26T10:58:52.773 に答える