C ++位移哪种方式

时间:2015-02-09 00:14:00

标签: 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) 

新结构(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) 

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

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

这是对的吗?前3位(& 0x07)移位>> 1成为第一nibble而第二3位(& 0x38)移位>> 2第二nibble形成一个字节。或者是英特尔是另一种字节顺序的另一种转变?

1 个答案:

答案 0 :(得分: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

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