2015-02-09 62 views
1

我很難理解我應該將位從一個結構的一部分轉換到另一個結構的方式。我正在編寫一個僅在Windows/Intel系統上使用的應用程序。C++位移是哪種方式

舊結構(數據字節):

Return Number 3 bits (bits 0 – 2) 
Number of Returns 3 bits (bits 3 – 5) 
Scan Direction Flag 1 bit (bit 6) 
Edge of Flight Line 1 bit (bit 7) 

新結構(ReturnData和數據字節):

Return Number 4 bits (bits 0 - 3) 
Number of Returns (given pulse) 4 bits (bits 4 - 7) 

Classification Flags 4 bits (bits 0 - 3) 
Scanner Channel 2 bits (bits 4 - 5) 
Scan Direction Flag 1 bit (bit 6) 
Edge of Flight Line 1 bit (bit 7) 

位0至5應爲0作爲數據是在現有的記錄未知。我認爲轉換到使用位掩碼和移位的新結構:

New->ReturnData = (Old->DataByte & 0x07)>>1 | (Old->DataByte & 0x38)>>2; 
New->DataByte = Old->DataByte & 0xC0; 

這是正確的嗎?前3位(& 0x07)移位>> 1變成第一個nibble而第二個3位(& 0x38)移位>> 2第二個nibble形成一個字節..或者是另一種方式移位,因爲英特爾是另一個字節碼?

+0

移位時,您不必關心字節順序。當你有'X = Y >> 1'時,X總是比Y更小(或者等於0),而不管字節順序如何。 – Aitch 2015-02-09 00:22:30

回答

5

無論字節順序如何,位0都是位0。字節順序影響內存中的字節順序,只有當您想要通過線路重新解釋或發送數據時才應該考慮這一點。數學總是內部一致的。

位0-2將是0x07,位3-5將是0b0011 1000,這是0x38。現在在新的數據結構中,「返回號碼」保持在同一位置,「返回數量」只是向上移動一個(從3-5)到(4-7)。這就是:

New->ReturnData = (Old->DataByte & 0x07) // these bits stay in the same place 
     | ((Old->DataByte & 0x38) << 1); // these shift up one 

您的掃描+邊緣邏輯看起來是正確的。

+0

感謝您清除Barry,所以我*做了*錯誤的解決方案,而字節排序更多的是字節中的字節而不是字節本身。 – 2015-02-09 00:29:34