信仰青春 2023-11-28 20:23 采纳率: 16.7%
浏览 13
已结题

C语言位运算,请教一下一下的总结是否正确


//代码示例
//备 注:摩托罗拉格式
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条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-28 22:35
    关注

    【相关推荐】



    • 这有个类似的问题, 你可以参考下: 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 

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月19日
  • 创建了问题 11月28日

悬赏问题

  • ¥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的连乘积值