我對一個名爲OpenBCI的新物聯網項目感興趣,該項目基本上是用於讀取和處理腦波和其他生物數據的開源EEG。在他們的docs中,他們聲稱通過空中傳輸的數據(通過RFDuino)發送24位數據。到了24位值轉換爲32位有符號整數,他們提出以下Java友好Processing代碼:Java中的24位到32位轉換
int interpret24bitAsInt32(byte[] byteArray) {
int newInt = (
((0xFF & byteArray[0]) << 16) |
((0xFF & byteArray[1]) << 8) |
(0xFF & byteArray[2])
);
if ((newInt & 0x00800000) > 0) {
newInt |= 0xFF000000;
} else {
newInt &= 0x00FFFFFF;
}
return newInt;
}
我想我試圖瞭解究竟是怎麼回事。讓我們的代碼的第一個導語:
int newInt = (
((0xFF & byteArray[0]) << 16) |
((0xFF & byteArray[1]) << 8) |
(0xFF & byteArray[2])
);
- 爲什麼是安全的假設有輸入3個字節?
0xFF
值的重要性是什麼?- 左移位的目的是什麼(
<<
)?
第二段也是一個有點神祕:
if ((newInt & 0x00800000) > 0) {
newInt |= 0xFF000000;
} else {
newInt &= 0x00FFFFFF;
}
- 爲什麼
newInt & 0x00800000
?0x00800000
有什麼意義? - 爲什麼
if-else
基於上述操作的陽性與陰性結果? 0xFF000000
和0x00FFFFFF
是什麼意思?
我想這個功能有很多handwaving和magic,我想更好地理解!
最後一部分是簽名擴展的一個晦澀的方式,else分支是無操作的。更加明顯的是'newInt =(newInt << 8) >> 8' – harold