2010-11-05 62 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