C++ 移位方式
C++ bit shift which way
我无法理解我应该以何种方式移动位以将一种结构的一部分转换为另一种结构。我正在编写一个仅在 Windows / Intel 系统上使用的应用程序。
旧结构(数据字节):
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 and the second 3 bits (& 0x38) shifted >> 2
the second nibble 形成一个字节.. 或者是另一种方式移位,因为英特尔是另一种字节顺序?
无论字节序如何,第 0 位都是第 0 位。 Endianness 影响内存中的字节顺序,只有当你想通过网络重新解释或发送数据时,这才重要。数学总是内在一致的。
位 0-2 将是 0x07
,位 3-5 将是 0b0011 1000
,即 0x38
。现在在新的数据结构中,"return number" 保持不变,而 "number of returns" 只是向上移动一位(从 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 逻辑看起来是正确的。
我无法理解我应该以何种方式移动位以将一种结构的一部分转换为另一种结构。我正在编写一个仅在 Windows / Intel 系统上使用的应用程序。
旧结构(数据字节):
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 and the second 3 bits (& 0x38) shifted >> 2
the second nibble 形成一个字节.. 或者是另一种方式移位,因为英特尔是另一种字节顺序?
无论字节序如何,第 0 位都是第 0 位。 Endianness 影响内存中的字节顺序,只有当你想通过网络重新解释或发送数据时,这才重要。数学总是内在一致的。
位 0-2 将是 0x07
,位 3-5 将是 0b0011 1000
,即 0x38
。现在在新的数据结构中,"return number" 保持不变,而 "number of returns" 只是向上移动一位(从 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 逻辑看起来是正确的。