//代码示例
//备 注:摩托罗拉格式
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);
C语言位运算,请教一下一下的总结是否正确
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注 【相关推荐】
- 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/1072290
- 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C语言函数体 计算一维数组的最值和下标
- 同时,你还可以查看手册:c语言-内存模型与数据竞争 中的内容
- 您还可以看一下 王健伟老师的C语言入门篇课程中的 位的概念以及位运算符介绍小节, 巩固相关知识点
- 除此之外, 这篇博客: C语言基础内容梳理中的 一,数据类型总览 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
数据类型 所占内存大小 char //字符数据类型 1 byte int //整型 4 byte short //短整型 2 byte long //长整型 4 byte long long //更长的整型 8 byte float //单精度浮点型 4 byte double //双精度浮点型 8 byte
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^解决评论 打赏 举报无用 1
悬赏问题
- ¥15 求caverdock使用教程
- ¥15 Coze智能助手搭建过程中的问题请教
- ¥15 12864只亮屏 不显示汉字
- ¥20 三极管1000倍放大电路
- ¥15 vscode报错如何解决
- ¥15 前端vue CryptoJS Aes CBC加密后端java解密
- ¥15 python随机森林对两个excel表格读取,shap报错
- ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
- ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
- ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值