.NET Micro Framework有替代方案吗? 我正在考虑简单地使用bool [],但是如何将其转换回 为byte []?.NET Micro Framework的BitArray替代方案
在完整的框架,考虑到“位”是一个BitArray,以下工作:
但我似乎无法找到BitArray类的微架构
.NET Micro Framework有替代方案吗? 我正在考虑简单地使用bool [],但是如何将其转换回 为byte []?.NET Micro Framework的BitArray替代方案
在完整的框架,考虑到“位”是一个BitArray,以下工作:
但我似乎无法找到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[]
,可能),并进行划分以确定你想要哪个字节/位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
例子。
太棒了!谢谢 ! – TimothyP 2010-11-05 15:38:43
如果'Interlocked.CompareExchange'在微框架上可用,则可以使用它来使任何所需类型的位操作为原子。在一个循环中,读取该单词的旧值,计算一个新值,并将旧值与旧CompareExchange对比。 reloop直到CompareExchange成功。我个人喜欢有一个原子方法来计算'Thebits =(TheBits&〜Mask)^ NewBits)'。 “Mask”和“NewBits”中清除的位是独立的;那些在'Mask'中清楚并在'NewBits'中设置的值被切换。在Mask中设置的位将从NewBits复制。 – supercat 2012-10-01 15:08:59
您可以在802.15.4协议栈中找到BitArray实现。只需在Porting Kit中搜索BitArray.cs
你究竟需要什么?也许你可以操纵一个'byte'就足够了? – Bobby 2010-11-05 14:55:21
BitArray是使用整数和位运算符来实现的 – 2010-11-05 15:23:56
@Bobby nope真的需要在位级操作:-) – TimothyP 2010-11-06 16:45:12