.NET Micro Framework的BitArray替代方案

3

是否有.NET Micro Framework的BitArray替代品?我在考虑是否可以简单地使用bool[],但如何将其转换回byte[]?

在完整的框架中,如果考虑“bits”是一个BitArray,则以下方法可行:

byte[] data = new byte[dimensions / 8];
bits.CopyTo(data, 0);

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


1
你需要什么?也许一个可以操作的“byte”就足够了? - Bobby
BitArray是使用整数和位运算符实现的。 - Ryan Emerle
@Bobby 不,真的需要在位级别上操作 :-) - TimothyP
3个回答

5

如果您需要复制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示例中的操作相同。

3
如果微型框架上有 Interlocked.CompareExchange 可用,可以使用它来使任何所需类型的位操作变为原子操作。在循环内,读取单词的旧值,计算一个新值,并使用 CompareExchange 将旧值替换为新值;如果 CompareExchange 成功,则重新循环。我个人喜欢有一个原子方法来计算 Thebits = (TheBits & ~Mask) ^ NewBits)。清除掩码和新比特中未设置的位数将保持不变;清除掩码并在新比特中设置的位将被切换;掩码中设置的位将从新比特中复制。 - supercat

2
你可以在802.15.4堆栈中找到BitArray实现。只需搜索BitArray.cs的移植工具包即可。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接