2011-02-14 51 views
2

我試圖從精確例如一個字節一個3位值:合併bitshifts

unsigned char r = ((253 << 5) >> 5); 

結果值應該是5但爲什麼它返回253?

+1

爲什麼不使用一個位掩碼去掉你的情況下的3個LSB - 00000111b? – StuartLC 2011-02-14 13:46:27

回答

8

兩種可能性:

  • 你的表達被評估爲的整數且鑄造爲中端SNGLE字節值。
  • 編譯器優化了轉換操作。

請注意,您的結果應該是5,不3.你想要的是:

const unsigned char c = 253 & 0x07 ; // (00000111) 

你的位掩碼是:

253 | 1 1 1 1 1 1 0 1 | F D 
    7 | 0 0 0 0 0 1 1 1 | 0 7 
+++++++++++++++++++++++++++ 
    5 | 0 0 0 0 0 1 0 1 | 0 5 
1

由於整數推廣。表達式253 << 5中沒有任何內容限制它僅在一個字節中工作;文字253的類型是int

你需要添加演員,或者(更好,在我看來)使用掩碼提取。從一個整數得到的最低三個位,只需使用:

const unsigned char r = 253 & ~((1 << 3) - 1); 

此操作,因爲1 < < 3是8 ,這在二進制是00001000 。我們減去一個,得到7 或00000111 。我們反轉這個,得到一個包含除最右邊三位之外的所有內容的掩碼,即11111000 。然後這個值與按值進行逐位提取。

上面我只用8位顯示了二進制數值,在左邊用零延伸直到您的平臺的尺寸爲int,因爲以上是使用int精度完成的。

3

使用整數評估你的表達。將其更改爲:

unsigned char r = ((unsigned char)(253 << 5) >> 5); 

並且您應該獲得所需的結果。