.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