2011-07-06 10 views
0

BitArrayを使用して最も基本的なものをいくつか行うにはどうすればいいですか?私はこれまで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); 
} 

だから私は...あなたもありません、それをキャストする方法を知っていることの一つは、多くの制限です知らなくても、これを実装する約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はこれまで有用であるのですか?それはそんなに制限がある場合..あなたは、このような&|~^

ですでにANDORNOTXORとして、それの操作のすべてを行うことができ、私はあなたがより多くのビットを扱っているときBitArrayが最もよく使用されていると思い、その後任意のデータ型を表すことができます。 。圧縮/暗号化など。

+0

あなたは今かなり理解しているようです。 –

+0

Meh yeah私はこの質問を投稿した後、BitArrayを完全に削除しました。しかし、これは、この質問に取り組んでいる人を助けることができ、うまくいけばBitArrayに苦労しています。 – SSpoke

答えて

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; 

私はこのことができます願っています。

+0

それは確かにしかしループhahaでもそこに行く多くのものへの道を助けます。 – SSpoke

関連する問題