C ++位移哪种方式

Posted

技术标签:

【中文标题】C ++位移哪种方式【英文标题】:C++ bit shift which way 【发布时间】:2015-02-09 00:13:59 【问题描述】:

我无法理解应该以哪种方式将位从一个结构的一部分转换为另一个结构。我正在编写一个仅用于 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,因为该数据在现有记录中是未知的。我认为使用位掩码和移位转换为新结构:

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

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

【问题讨论】:

当移位时你不必关心字节顺序。当您拥有X = Y >> 1 时,无论字节序如何,X 总是小于(或等于如果为零)Y。 【参考方案1】:

无论字节顺序如何,位 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 逻辑看起来是正确的。

【讨论】:

感谢您对 Barry 的澄清,所以我确实弄错了,字节序更多地与字中的字节有关,而不是字节本身。

以上是关于C ++位移哪种方式的主要内容,如果未能解决你的问题,请参考以下文章

C联接指向数组的指针

C语言float类型储存和printf输出问题

c_cpp C中的位移实践

C ++:对无符号短进行位移

C语言中位移位运算符?

C和C指针小记-操作符