适用于.NET Micro Framework的BitArray替代方案

Tim*_*hyP 3 .net .net-micro-framework bitarray

是否有针对.NET Micro Framework的BitArray替代方案?我在考虑简单地使用bool [],但是如何将它转换回byte []?

在完整的框架中,考虑"位"是BitArray,以下工作:

byte[] data = new byte[dimensions / 8];
bits.CopyTo(data, 0);
Run Code Online (Sandbox Code Playgroud)

但我似乎无法在微框架中找到BitArray类

Jim*_*hel 5

复制功能并不是非常困难BitArray.首先,如果您需要少于65位,那么您可以使用long或更小.

设置单个位:

void Set(ref long ba, int bit)
{
    ba |= 1L << bit;
}
Run Code Online (Sandbox Code Playgroud)

要清楚一点:

void Clear(ref long ba, int bit)
{
    long mask = 1L << bit;
    mask = ~mask;
    ba &= mask;
}
Run Code Online (Sandbox Code Playgroud)

要查看是否设置了位:

bool IsSet(long ba, int bit)
{
    long mask = 1L << bit;
    return (ba & mask) != 0;
}
Run Code Online (Sandbox Code Playgroud)

如果你有超过64位,那么你需要创建一个数组(byte[]可能),然后进行除法以确定要修改的字节/位.上面的方法将工作,只要你改longbyte.

例如,如果您有:

byte[] myBytes = new byte[128];
Run Code Online (Sandbox Code Playgroud)

你有1024位.

设置一下:

void Set (int bit)
{
    int byte = bit/8;
    int bitIndex = bit%8;
    myBytes[byte] |= (byte)(1 << bitIndex);
}
Run Code Online (Sandbox Code Playgroud)

其他方法使用相同的数学运算来获取字节和位索引,设置,清除和测试位与long上面的示例相同.

  • 如果在微框架上可以使用`Interlocked.CompareExchange`,则可以使用它来使任何所需类型的位操作成为原子.在一个循环中,读取该单词的旧值,计算一个新值,并将旧值与"CompareExchange"相对应; reloop直到`CompareExchange`成功.我个人喜欢使用原子方法来计算"Thebits =(TheBits&〜Mask)^ NewBits".在"Mask"和"NewBits"中清晰的位是独立的; 那些在"Mask"中清晰并在"NewBits"中设置的内容被切换.在`Mask`中设置的位将从`NewBits`复制. (2认同)