c语言位运算_乾坤大挪移-位运算

d551a94e3ac59db1ec0ff7f295bb30fc.png

http://weixin.qq.com/r/LR26omTEiTn2rSDB90g- (二维码自动识别)

原文地址:乾坤大挪移-位运算

本文内容可能会比较烧脑!请谨慎阅读,避免用脑过度!!

1、背景介绍

没有无缘无故的爱,也没有无缘无故的恨,【思想】更新的内容每篇都有背景,不会单纯觉得好玩而写,只不过有些可以分享有些不能分享。按计划本期内容是要介绍Motorola编码格式的CAN报文处理的,但是【思想】发现处理Motorola格式报文,需要位运算的相关知识,所以本期内容先想跟大家普及一下位运算。

2、初识位运算

就像很多人都声称自己学过Excel,可是10个中至少6个不知道vlookup怎么用?同样的,学习过C语言的也有不少人不太了解位运算。位运算是一种比较底层的计算法则,不同于常见的加减乘除位运算直接对数据的位进行操作,这种运算方式即高效又灵活,在嵌入式系统开发中被广泛运用。

其实,【思想】学习了C语言后也不知道位运算有啥用,直到大三时候学C51的时候。老师让我们做一个跑马灯试验,当时是用幂运算完成的。后来,老师讲解时,只要一行简简单单的位运算代码就能实现,执行效率比幂运算高了不少。当然,位运算的用途可不仅仅是做个跑马灯试验。

3、<<|&~^>>

这部分内容其实网上到处有,【思想】就稍微总结下。基础的位运算包含:<<位左移,>>位右移,|位或运行,&位与运算,^位否运算。

<<>>位移运算

d2349109a55c324217d696219e407bdf.png

将整个字节中的位整体左移或者右移,补充进来的位填0,溢出部分则丢弃;

|位或运算

7d53fcf337c03b16754a9746ccb41265.png

将两个数的位一一对应,对应的两个位进行位或运算,只要有一个是1,结果输出1否则输出0;

&位与运算

a67af9d41772f30b7abf2a7e8c34828c.png

将两个数的位一一对应,对应的两个位进行位与运算,两个同时为1,结果输出1否则输出0;

~取反运算

f40d39e878e6c76d2a876b3b80e06973.png

遇到0输出1,遇到1输出0;

^异或运算

9f60ba341935fe1e582d6baf3c80ff48.png

将两个数的位一一对应,对应的两个位进行异或运算,两个位相同输出0不同输出1;


3、应用场景

除了上面介绍的跑马灯案例外,位运算还有什么实际的运用呢呢呢?位运算的高效与灵活,被广泛在在通讯与嵌入式领域使用。

拼字节

跟我们出去拼桌,拼车一样。嵌入式开发为了节约资源,经常需要在一个字节中存放多个数据。这种情况下,就要灵活的运用位运算,通过位移运算读取数据。

247b7724d65d7950b9149393e0741768.png

在CAN报文矩阵中,经常能看到这样多个信号共用一个字节的情况。此时,位运算能通过位移操作,提取bit5中的igbtStatus信号:

例:将第0字节左移1个位再右移6个位

igbtStatus

数据位赋值

上面讲的是如何利用位移读取igbtStatus信号,下面讲讲如何对igbtStatus进行赋值为0x02(二进制位10)。首先,通过位移将0x02左移五个位

0x02<<5=0x40

为了保护其他位的数据使用或运算进行赋值

Byte[0]=Byte[0]|0x40

但是这样还不够,假设如果此时字节中的5、6位都为0,那单纯用位运算是没用的,所以位与运算前一定要通过一个位与运算将5、6位置0。完成操作如下:

Byte[0]= Byte[0]&0x9F|0x40

其中0x9F为掩码用于保护其他位数据的前提下清空5、6位。知识是一环扣一环得,这里还涉及到掩码,【思想】会另外找一期跟大家介绍什么是掩码!(小编到这里已经脑仁裂开了!!老铁们可以再坚持一下)

a43bff3d2f6bb055bc621fc485655876.png

当然这种用法不仅仅用在CAN矩阵报文赋值中,其实在MCU的寄存器操作也可以广泛运用。上诉是某芯片的用户手册对寄存器的描述,可以看到一个字节不同的为描述不同的寄存器。

加密

利用异或运算加密是一种最简单的加密手段,原始值通过与秘钥异或加密得到密文,只要在跟这个秘钥再进行一次异或预算就会还原原始值

0b5b7b3ebfbeb17e9ae33ffb2d2c595e.png

原文0x3与0x8异或运算得到密文0xB,密文0xB再与0x8异或运算解密的0x03

9e3ed6cc552d9c9907892e809e3d61c8.png
  1. 跟【思想】一起,在家里玩HIL(VCU仿真实例)
  2. 跟【思想】一起,在家里玩HIL(1)
  3. 【旁门左道】提取万有特性数据
  4. 动力经济性信息系统(2)
  5. 动力经济性信息系统(1)
  6. CRUISE&CRUISE M傻傻分不清楚
  7. 换挡策略如何影响动力经济性
  8. Amesim电动车仿真
  9. Amesim与Simulink联合仿真演示
  10. Amesim与Simulink联合仿真
  11. 增程式发动机仿真控制逻辑详解(二)
  12. 增程式发动机仿真控制逻辑详解(一)
  13. 增程式混合动力系统动力经济性仿真
  14. 工况路谱的采集与数据处理
  15. 路谱数据滤波工具
  16. 混合动力节油的秘密-发动机万有特性
  17. AVL-CRUISE纯电动仿真策略提高教程
  18. AVL-CRUISE纯电动模型仿真策略
  19. 燃料电池车(FCHEV)动力经济性建模与仿真
  20. CRUISE与Isight联合仿真优化
  21. CRUISE与Simulink联合仿真介绍
  22. 部分仿真软件对比介绍
  23. 体验整车控制器程序设计
  24. 永磁同步电机是什么?
  25. 【科普】整车控制器-软件篇
  26. 【科普】整车控制器-硬件篇
  27. Simulink中浮点数的优化表示法
  28. 嵌入式C语言中CAN报文字节序问题的处理方法
  29. 嵌入式C语言环境下的CAN总线通讯协议
  30. Simulink代码生成提高教程
  31. S-Funciton应用实例
  32. 汽车工程师眼中的C#
  33. Simulink代码生成应用教程
  34. Sinmulink代码生成基础体验教程
  35. CAN总线(J1939)速成指南【1】
  36. DBC文件助手~三月累计更新
  37. DBC文件助手-基础功能介绍2
  38. DBC文件助手-基础功能介绍1
  39. 路谱数据滤波工具
  40. Excel与DBC文件的互相转换
  41. 电机效率MAP生成工具
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值