2011-07-06 152 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

呃是的我發佈這個問題後,我完全刪除了BitArray ..但我希望這可以幫助其他人googling這個問題,並與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

它可以幫助確定,但有很多事情發生在那裏,甚至一個循環哈哈。 – SSpoke