2010-11-05 131 views
3

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

在完整的框架,考虑到“位”是一个BitArray,以下工作:

​​

但我似乎无法找到BitArray类的微架构

+1

你究竟需要什么?也许你可以操纵一个'byte'就足够了? – Bobby 2010-11-05 14:55:21

+0

BitArray是使用整数和位运算符来实现的 – 2010-11-05 15:23:56

+0

@Bobby nope真的需要在位级操作:-) – TimothyP 2010-11-06 16:45:12

回答

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[],可能),并进行划分以确定你想要哪个字节/位dify。如果您将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例子。

+0

太棒了!谢谢 ! – TimothyP 2010-11-05 15:38:43

+2

如果'Interlocked.CompareExchange'在微框架上可用,则可以使用它来使任何所需类型的位操作为原子。在一个循环中,读取该单词的旧值,计算一个新值,并将旧值与旧CompareExchange对比。 reloop直到CompareExchange成功。我个人喜欢有一个原子方法来计算'Thebits =(TheBits&〜Mask)^ NewBits)'。 “Mask”和“NewBits”中清除的位是独立的;那些在'Mask'中清楚并在'NewBits'中设置的值被切换。在Mask中设置的位将从NewBits复制。 – supercat 2012-10-01 15:08:59

2

您可以在802.15.4协议栈中找到BitArray实现。只需在Porting Kit中搜索BitArray.cs