2009-06-16 103 views
1

我有一些舊的代碼是這樣的:位在C#中移混亂

private int ParseByte(byte theByte) 
{ 
     byte[] bytes = new byte[1]; 
     bytes[0] = theByte; 
     BitArray bits = new BitArray(bytes); 

     if (bits[0]) 
      return 1; 
     else 
      return 0; 
} 

它的長,我想我可以修剪下來是這樣的:

private int ParseByte(byte theByte) 
{ 
     return theByte >> 7; 
} 

但是,我沒有變與第一個函數相同的值。該字節包含00000000或10000000.我在這裏錯過了什麼?我是否使用不正確的操作符?

回答

4

問題是,在第一個函數中,bits [0]返回最低有效位,但第二個函數返回最高有效位。要修改第二個功能得到最低顯著位:

private int ParseByte(byte theByte) 
{ 
    return theByte & 00000001; 
} 

要修改的第一個函數返回的最顯著位,你應該使用位[7] - 不位[0]。

+0

因此,我用來查看數據的十六進制編輯器顯示爲10000000.我想它先顯示lsb?我在BitArray中感到困惑時感到幸運? – scottm 2009-06-16 16:09:20

0

也許第一個函數應該檢查位[7]?

+0

第一個函數得到我想要的,第二個不起作用。 – scottm 2009-06-16 15:35:55

+0

做了以下工作: 返回((int)theByte == 128)? 1:0; – 2009-06-16 15:41:19

0

您的二進制數字中有一個額外的零(每個數字中有9位數字)。我假設這只是一個錯字。

你確定你正在做正確的訂購嗎?二進制傳統上是從右到左編寫的,而不是像大多數其他編號系統一樣從左到右編寫。如果你顯示的二進制數字是屬性格式(意思是10000000實際上是數字128而不是數字1),那麼你的第一個代碼段不應該工作,第二個代碼段應該工作。如果你將它寫回(意思100000001,而不是128),那麼你甚至不需要移位。只要與1(theByte & 1)。

事實上,不管採用哪種方法,按位AND(&運算符)似乎都比較合適。鑑於你的第一個功能工作,第二個功能沒有,我假設你只是向後寫了數字,並需要與上面描述的1進行AND。

+0

修復了錯字。我沒有向後寫,它是我正在閱讀的一些二進制數據的格式。我不知道爲什麼這樣做。我會盡力 – scottm 2009-06-16 15:42:38

0

根據位於Microsoft's site上的用戶,BitArray按比特順序在內部將這些位按大端順序存儲到Int32中。這可能會導致問題。有關解決方案和更多信息,請訪問鏈接。

3

的同等功能的第一snipet是:

return theByte & 1 == 1 

在第二snipet你chechink最有意義的位和第一snipet最低顯著。

0

1st第一個函數不起作用,因爲它試圖返回一個字符串而不是int。

但你可能想是這樣的:

private static int ParseByte(byte theByte) 
    { 
     return theByte & 1; 
    } 

但是你可能也想這樣:

private static string ParseByteB(byte theByte) 
    { 
     return (theByte & 1).ToString(); 
    } 
1

你想返回int或字符串?反正 - 你可以使用模:

return theByte % 2 == 0 ? "0" : "1" 

OK,你編輯...並想返回int

對您的換擋操作有一個詞:您將不得不使用< <而不是>>。但是,這將返回(當你轉換爲字節不是int)0或128,而不是0或1。所以,你可以重寫你的第二個解決方案爲:

return (byte)(theByte << 7) == 128 ? 1 : 0; 

但其他的答案包含比這真的更好的解決方案。