gpt4 book ai didi

c - 跨两个字节写入位

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:59 25 4
gpt4 key购买 nike

我有一个要求,我必须跨两个字节将一个十六进制值写入一个 11 位“容器”。布局如下:字节 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;

这样的事情是最好的方法吗?

最佳答案

需要明确的是,您希望实现以下安排:

enter image description here

因此对于您的示例 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 ;

关于c - 跨两个字节写入位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58018217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com