老师这样理解是正确的吗?
来源:3-7 运算符-2【难点突破】

慕丝4305819
2023-12-13
//备 注:摩托罗拉格式
typedef union
{
struct
{
uint8 t RemoteCtrlwinLF :2;//左前车窗控制
uint8 t RemoteCtrlwinRF :2;//右前车窗控制
uint8 t RemoteCtrlwinLR :2;//左后车窗控制
uint8 t RemoteCtrlwinLR :2;//右后车窗控制
}Bits1;
}DRM_1;
UINT8 u8Para1;//定义一个8位的变量来存储
//车窗控制共计有4个子功能,在一个字节里面分别占2位;我们需要取一个字节里面的对应的位来实现数据的传输解析
//常用方法 "<<" " >>" "&" "|" 左移 右移 与 或
//解读分析: 上面的结构体一个字节8位都占用了。
1.需要取"RemoteCtrlwinLF"信号
分析:它在8位里面占用了高2位,那么我们可以把不要的位都置0,剩下的用 '&' 拿出来。
"RemoteCtrlwinLF"信号占bits1的高两位,转换成16进制:0x03;
用:0000 0011 与运算 1111 1111;因此只有后面两位"1 1"与运算为真,保留,其它的为假则舍掉。
转换成代码:tCanMsgTBOX 011. RemoteCtrlwinLF = (uint8 t)(u8Para1 & 0x03u);
2.需要取"RemoteCtrlwinRF"信号
分析:它在8位信号中占次高两位,这个时候可以用移位操作,">>"右移两位,它上两位被"RemoteCtrlwinLF"信号占用但是不需要用它,就可以用右移把它拿掉,用"RemoteCtrlwinRF"信号代替它的位置,在低位部分补"0",再用与运算就可以拿出"RemoteCtrlwinRF"信号值;
即:"1111 1111"用右移去掉高两位,那么"RemoteCtrlwinRF"信号就成了高位,用0补齐低位,"0011 1111"; 用"0000 0011"与运算"0011 1111"就可以拿出;
转换成代码:tCanMsgTBOX 011. RemoteCtrlwinRF = (uint8_t)((u8Para1 >> 2U) & 0x03U)。
以此类推:取"RemoteCtrlwinLR","RemoteCtrlwinLR"的代码转换如下:
tCanMsgTBOX 011. RemoteCtrlwinLR = (uint8_t)((u8Para1 >> 4U) & 0x03u);
tCanMsgTBOX 011. RemoteCtrlwinR = (uint8 t)((u8Para1 >> 6U) & 0x03u);
写回答
1回答
-
bennyhuo
2023-12-14
Bits1 占 8 bit,从高到低依次对应其中的四个字段,这四个字段各自只占 2 bit。
例如:
DRM_1 drm_1 = { .Bits1 = { .RemoteCtrlwinLF = 0, .RemoteCtrlwinRF = 1, .RemoteCtrlwinLR = 2, .RemoteCtrlwinRR = 3 } };
这样 drm_1 这个变量的内存值是 e4,即 1011 0100,C 是小端序,对应的
10 11 01 00
LR RR RF LF
同学可以参考这个再来想想你的问题怎么处理哈。后面的格式有点儿乱,问题部分我看着有点儿费劲。要不你重新整理一下问题也可以。
022023-12-15
相似问题