如何根据值设置BitArray设置specfic Bits?

时间:2011-07-06 03:58:35

标签: c# visual-studio bit-manipulation 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对它有用?如果它有如此多的限制......你可以使用AND OR {NOT XOR & |来完成所有这些操作{1}} ~

我猜BitArray最适合用于处理更多位,然后任何数据类型都可以表示..用于压缩/加密等。

1 个答案:

答案 0 :(得分: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;

我希望这会有所帮助。