跨两个字节写入位

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 ;

如果Byte4Byte5中未使用的位已经包含必须保持不变的数据,则:

Byte4 = (Byte4 & 0xC0) | (Word & 0x07E0) >> 5 ;
Byte5 = (Byte5 & 0x07) | (Word & 0x001F) << 3 ;