2013-07-08 37 views
5

我有一個包含兩個值的單字節。這裏的文檔:如何使用字節中的位

權威字節分成兩個字段。三個最低有效位攜帶用戶的權限級別(0-5)。五個最重要的位攜帶一個覆蓋拒絕閾值。如果這些位是 設置爲零,則使用系統拒絕閾值來確定 此用戶的分數是否被認爲是接受或拒絕。如果他們的 不爲零,那麼這些位的值乘以10將爲此用戶的閾值分數 。

管理局字節:

7 6 5 4 3 ......... 2 1 0 
Reject Threshold .. Authority 

我沒有與C#位工作的任何經驗。

有人可以幫助我轉換一個字節,並獲得上述值?

我試過下面的代碼:

BitArray BA = new BitArray(mybyte); 

但長度回來爲29,我本來預計8,是在字節的每一位。

- 感謝大家的快速幫助。現在就開始工作吧!真棒互聯網。

+0

你也可以找到[這篇文章](http://stackoverflow.com/questions/93744/most-common-c-sharp-bitwise-operations-on-enums)。 –

回答

7

相反的BitArray,您可以更方便地使用內置bitwise ANDright-shift操作如下:

byte authorityByte = ... 

int authorityLevel = authorityByte & 7; 
int rejectThreshold = authorityByte >> 3; 

要獲取單個字節回來,你可以使用bitwise ORleft-shift操作:

int authorityLevel = ... 
int rejectThreshold = ... 

Debug.Assert(authorityLevel >= 0 && authorityLevel <= 7); 
Debug.Assert(rejectThreshold >= 0 && rejectThreshold <= 31); 

byte authorityByte = (byte)((rejectThreshold << 3) | authorityLevel); 
+0

你能告訴我如何將這兩個值轉換回單個字節? – Anonymous

3

您正在使用錯誤的構造函數(可能)。

您使用的一個可能是this one,當你需要this one

var bitArray = new BitArray(new [] { myByte }); 
5

您使用BitArray的不正確。此:

BitArray BA = new BitArray(mybyte); 

..將被隱式轉換爲int。當發生這種情況時,你觸發這個構造函數:

BitArray(int length); 

..因此,它創建一個特定的長度。

看着MSDN(http://msdn.microsoft.com/en-us/library/x1xda43a.aspx)你想這樣的:那麼

BitArray BA = new BitArray(new byte[] { myByte }); 

長度爲8(如預期)。

3

爲了得到五個最顯著位的值以字節爲一個整數,通過3(由8-5 IE)的字節向右移位,並且使用按位AND操作三個高位比特設置爲零,這樣:

byte orig = ... 
int rejThreshold = (orig >> 3) & 0x1F; 
  • >>是 「右移」 運算符。它將位7..3移動到位置4..0,將三個較低的位放下。
  • 0x1F是二進制數00011111,它的高三位設爲零,低位五位設爲1。 AND - 用這個數字清零三個高位。

這種技術可以推廣到其他位模式和其他整型數據類型。您將所需的位移入最不重要的位置,然後應用一個掩碼來「切除」您想要的位數。在某些情況下,轉換不是必需的(例如,當你得到最不重要的一組比特時)。在其他情況下,如上所述,屏蔽將不是必需的,因爲您獲得了無符號類型中最重要的一組位(如果該類型被簽名,則需要AND ing)。

相關問題