C++位移哪种方式

Mic*_*son 1 c++ bit-manipulation

我无法理解我应该将位移位从一个结构的一部分转换为另一个结构的方式.我正在编写一个仅在Windows/Intel系统上使用的应用程序.

旧结构(DataByte):

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) 
Run Code Online (Sandbox Code Playgroud)

新结构(ReturnData和DataByte):

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) 
Run Code Online (Sandbox Code Playgroud)

位0到5应为0,因为现有记录中的数据未知.我认为使用位掩码和移位转换为新结构:

New->ReturnData = (Old->DataByte & 0x07)>>1 | (Old->DataByte & 0x38)>>2;
New->DataByte = Old->DataByte & 0xC0;
Run Code Online (Sandbox Code Playgroud)

那是对的吗?移位的前3位(&0x07)>> 1成为第一个半字节,第二个3位(&0x38)移位>> 2第二个半字节形成一个字节..或者是另一种方式,因为英特尔是另一个字节序?

Bar*_*rry 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
Run Code Online (Sandbox Code Playgroud)

您的Scan + Edge逻辑看起来是正确的.