是否有.NET Micro Framework的BitArray替代品?我在考虑是否可以简单地使用bool[],但如何将其转换回byte[]?
在完整的框架中,如果考虑“bits”是一个BitArray,则以下方法可行:
byte[] data = new byte[dimensions / 8];
bits.CopyTo(data, 0);
但是我似乎无法在微框架中找到BitArray类
是否有.NET Micro Framework的BitArray替代品?我在考虑是否可以简单地使用bool[],但如何将其转换回byte[]?
在完整的框架中,如果考虑“bits”是一个BitArray,则以下方法可行:
byte[] data = new byte[dimensions / 8];
bits.CopyTo(data, 0);
但是我似乎无法在微框架中找到BitArray类
如果您需要复制BitArray
的功能,这并不是非常困难。首先,如果您需要少于65位,则可以使用long
或更小的类型实现。
要设置单个位:
void Set(ref long ba, int bit)
{
ba |= 1L << bit;
}
清楚一点:
void Clear(ref long ba, int bit)
{
long mask = 1L << bit;
mask = ~mask;
ba &= mask;
}
要查看位是否已设置:
bool IsSet(long ba, int bit)
{
long mask = 1L << bit;
return (ba & mask) != 0;
}
如果您拥有超过64位,则需要创建一个数组(byte[]
,可能),并执行除法运算以确定要修改的字节/位。上面的方法将起作用,只要您将long
更改为byte
。
例如,如果您有:
byte[] myBytes = new byte[128];
您拥有1024个比特。
要设置一个比特:
void Set (int bit)
{
int byte = bit/8;
int bitIndex = bit%8;
myBytes[byte] |= (byte)(1 << bitIndex);
}
long
示例中的操作相同。Interlocked.CompareExchange
可用,可以使用它来使任何所需类型的位操作变为原子操作。在循环内,读取单词的旧值,计算一个新值,并使用 CompareExchange
将旧值替换为新值;如果 CompareExchange
成功,则重新循环。我个人喜欢有一个原子方法来计算 Thebits = (TheBits & ~Mask) ^ NewBits)
。清除掩码和新比特中未设置的位数将保持不变;清除掩码并在新比特中设置的位将被切换;掩码中设置的位将从新比特中复制。 - supercat