2014-01-30 172 views
0

我正在讀取來自加速度計的值並將其保存在名爲「值」的緩衝區中。每個加速度計的讀數是10位長,但讀取的值是字節,所以加速度計讀數實際上是'值'緩衝區中的兩個字節或兩個值。這是關於如何將這些兩個字節組合示例代碼來獲取一個值:有人可以向我解釋這一行代碼嗎?

x = ((int)values[1]<<8)|(int)values[0]; 

,我感到我正在合併值[1]和值[2],我敢肯定的(INT)部分是類型轉換爲整數的部分(雖然我不知道爲什麼)。讓我感到困惑的部分是<<8和豎線|。這兩部分在做什麼?

感謝您的任何解釋和幫助,您可以給!

+1

http://www.cprogramming.com/tutorial/bitwise_operators.html – SLaks

回答

0

以二進制形式的0101010111的10位讀數爲例。

低8位以二進制形式(= 87十進制)轉至values[0] = 01010111

高2位去values[1] = 01

要從values恢復原始的10位號碼:

(int)values[1] << 8 --> 01 << 8 --> 0100000000 

values[1]被轉換爲INT(典型地32位),然後左移<< 8位。

((int)values[1]<<8) | (int)values[0] --> 0100000000 | 01010111 

或在垂直符號來表示按位或:

0100000000 
| 01010111 
------------ 
    0101010111 

QED

3

這是一個位掩碼

您是left shifting (<<)的值values[1]8位位置。然後ORing (|)它的值爲values[0]

請採取一些值,並嘗試通過它們。你會更好地理解它。

這是link更多閱讀和位操作示例。

2

這行代碼將第一個字符移動8位的方式將兩個字符組合成int。

例如,值[0] = 5,值[1] = 1,則讀入值應該是128 + 5 = 133.因爲高字節1表示128.另一種看待它的方法是:

x = ((int)values[1]<<8) + (int)values[0]; 

替換或用+,它會更具可讀性。希望這可以幫助。

0

< <運算符將第二個字節中的位左移8位,例如0000000011111111變成1111111100000000。是二進制「或」運算符,它將每個位置的兩位合併爲1,如果其中一位或兩位均爲1.

0

您有2個字節(1個字節= 8位)和你正在試圖在一個10到讀這就是爲什麼你需要2個字節而不是僅僅使用1的原因。當你在讀取數值時,你需要將2個字節轉換爲int,這樣你可以把它們看作整數值,但是如果value[1]是3 (00000011)而下一個字節value[0]是227 (11100011)如果你加他們,你需要用8

留下當你的點點你最終0 8無符號字符/字符/字節偏移移位value[1]你可以得到一個適當的閱讀,所以你需要投既value[1]value[0]爲int,所以當你做移位你結束了,現在768 (00000011 00000000)|value [0]和你結束了

(00000011 00000000 | 00000000 11100011) = (00000011 11100011) = 995 

注意到我只使用16位整數這樣的例子ISN」 t充滿了一堆0。

如果您有權訪問編程計算器,它可以幫助您瞭解爲什麼需要將這些字節值轉換爲整數,它也可以幫助您完成一般性的轉換。如果你有權訪問它,我會用suclock來玩一下windows Calculator應用程序。爲了進入程序員視圖去查看 - >程序員。

相關問題