0

BitArray を使用して、ビットだけでなくビットに値を設定するなど、最も基本的なことを行うにはどうすればよいですか? BitArray と呼ばれるこのがらくたを使用したことを後悔し始めています。

このようなビットがあるとしましょう。

public enum RULE
{
    NOTHING = 0x0,
    FIRST_STEP = 0x1,
    FOO_YOU = 0x2,
    BAR_FOO = 0x10,
    FOO = 0x20,
    BAR = 0x40,
    FOO_BAR = 0x80,
    READY = 0x100,
    ...//LOTS MORE BITS
    FINAL_FLAG_BIT= 0x10000000 //Final bit.. uses the 29th bit.
};

今、私はこれを行うと言う..

//only use 29 bits to save memory, probably still uses 4 bytes lol.
BitArray rules= new BitArray(29);

//As you can see what I tried to do.
public bool ruleEnabled(RULE i)
{
    return rules[(int)i]; //<- this is impossible as it sets BITS not bitmasks.
}

public void setRule(RULE rule, bool b) {
    rules.Set((int)rule, b);
}

そのため、多くの制限の1つを知らずに、これを実装するのに約30分を無駄にしました..値にキャストする方法さえないことを知っています..CopyTo

そのため、最終的に変数を 1 つだけ使用することになり (このソリューションはよりクリーンで高速なようです)、2 つのメソッドを変更するだけsetRuleruleEnabled、適切に機能するようになりました。

private int rules; //uses only 29 of the 32 bits.
public bool ruleEnabled(RULE i)
{
    int bits = (int)i;
    return (rules & bits) == bits;
}

public void setRule(RULE rule, bool set) {
    if (set)
        rules |= (int)rule;
    else
        rules &= ~(int)rule;
}

私の質問は、私が正しいことをしたかどうかです。そして、BitArray がこれまでに役立つのはなぜですか? AND OR NOT XOR非常に多くの制限がある場合..すでに次のようなすべての操作を実行できます& | ~ ^

BitArray は、どのデータ型でも表現できるよりも多くのビットを扱う場合に最適に使用されると思います..圧縮/暗号化などのために..

4

1 に答える 1

0

BitArray は、フラグではなく、インデックスによってアクセスされます。たとえば、長さが 29 のビット配列の場合、可能なインデックスの範囲は 0 ~ 28 のみです。したがって、次は無効です。

rules[RULE.READY] = true; // where READY is equal to 0x100, but the
                    // bit array's length is only 29.

意図したとおりに機能させるには、最初にフラグをインデックスに変換する必要があります。次の機能が役立つ場合があります。

public static int FlagToIndex(int flag){
   int i=0;
   if(flag==0)return i;
   while((flag&1)==0){
     flag>>=1;
     i++;
   }
   return i;
}

この関数を使用すると、ビット配列に適切にインデックスを付けることができます。

rules[FlagToIndex((int)RULE.READY)] = true;

これが役立つことを願っています。

于 2011-07-06T04:24:11.533 に答える