跨两个字节写入位
Writing Bits across two bytes
我有一个要求,我必须跨两个字节将十六进制值写入 11 位 "container"。布局如下:字节 5(位 3)是 lsb,数据进入字节 4(位 5),这是 msb。将数据写入相关位位置的最佳方法是什么。
例如,如果我需要将值 0x1DA 写入这些位置,那么在保持位顺序正确的同时最好的方法是什么。
仅供参考,用于 8 字节 CAN 消息的 CAN 通信。
我正在考虑这样做:
_templsb = DatatoWrite & 0x1F;
_templsb <<= 3;
Byte5 &= ~0xF8;
Byte5 = Byte5 | _templsb;
_tempmsb = DatatoWrite & 0x7E0;
_tempmsb >>= 5;
Byte4 &= ~0x3F;
Byte4 = Byte4 | _tempmsb;
这样的事情是最好的方法吗?
明确地说,您希望实现以下安排:
因此对于您的示例 0x01DA,转换将是:
- 字节 4 = 0x0E
- 字节 5 = 0xD0
既然如此,那么:
uint16_t Word = 0x1DA ;
uint8_t Byte4 = (Word & 0x07E0) >> 5 ;
uint8_t Byte5 = (Word & 0x001F) << 3 ;
如果Byte4
和Byte5
中未使用的位已经包含必须保持不变的数据,则:
Byte4 = (Byte4 & 0xC0) | (Word & 0x07E0) >> 5 ;
Byte5 = (Byte5 & 0x07) | (Word & 0x001F) << 3 ;
我有一个要求,我必须跨两个字节将十六进制值写入 11 位 "container"。布局如下:字节 5(位 3)是 lsb,数据进入字节 4(位 5),这是 msb。将数据写入相关位位置的最佳方法是什么。
例如,如果我需要将值 0x1DA 写入这些位置,那么在保持位顺序正确的同时最好的方法是什么。
仅供参考,用于 8 字节 CAN 消息的 CAN 通信。
我正在考虑这样做:
_templsb = DatatoWrite & 0x1F;
_templsb <<= 3;
Byte5 &= ~0xF8;
Byte5 = Byte5 | _templsb;
_tempmsb = DatatoWrite & 0x7E0;
_tempmsb >>= 5;
Byte4 &= ~0x3F;
Byte4 = Byte4 | _tempmsb;
这样的事情是最好的方法吗?
明确地说,您希望实现以下安排:
因此对于您的示例 0x01DA,转换将是:
- 字节 4 = 0x0E
- 字节 5 = 0xD0
既然如此,那么:
uint16_t Word = 0x1DA ;
uint8_t Byte4 = (Word & 0x07E0) >> 5 ;
uint8_t Byte5 = (Word & 0x001F) << 3 ;
如果Byte4
和Byte5
中未使用的位已经包含必须保持不变的数据,则:
Byte4 = (Byte4 & 0xC0) | (Word & 0x07E0) >> 5 ;
Byte5 = (Byte5 & 0x07) | (Word & 0x001F) << 3 ;