http://weixin.qq.com/r/LR26omTEiTn2rSDB90g- (二维码自动识别)
原文地址:乾坤大挪移-位运算
本文内容可能会比较烧脑!请谨慎阅读,避免用脑过度!!
1、背景介绍
没有无缘无故的爱,也没有无缘无故的恨,【思想】更新的内容每篇都有背景,不会单纯觉得好玩而写,只不过有些可以分享有些不能分享。按计划本期内容是要介绍Motorola编码格式的CAN报文处理的,但是【思想】发现处理Motorola格式报文,需要位运算的相关知识,所以本期内容先想跟大家普及一下位运算。
2、初识位运算
就像很多人都声称自己学过Excel,可是10个中至少6个不知道vlookup怎么用?同样的,学习过C语言的也有不少人不太了解位运算。位运算是一种比较底层的计算法则,不同于常见的加减乘除位运算直接对数据的位进行操作,这种运算方式即高效又灵活,在嵌入式系统开发中被广泛运用。
其实,【思想】学习了C语言后也不知道位运算有啥用,直到大三时候学C51的时候。老师让我们做一个跑马灯试验,当时是用幂运算完成的。后来,老师讲解时,只要一行简简单单的位运算代码就能实现,执行效率比幂运算高了不少。当然,位运算的用途可不仅仅是做个跑马灯试验。
3、<<|&~^>>
这部分内容其实网上到处有,【思想】就稍微总结下。基础的位运算包含:<<位左移,>>位右移,|位或运行,&位与运算,^位否运算。
<<>>位移运算
将整个字节中的位整体左移或者右移,补充进来的位填0,溢出部分则丢弃;
|位或运算
将两个数的位一一对应,对应的两个位进行位或运算,只要有一个是1,结果输出1否则输出0;
&位与运算
将两个数的位一一对应,对应的两个位进行位与运算,两个同时为1,结果输出1否则输出0;
~取反运算
遇到0输出1,遇到1输出0;
^异或运算
将两个数的位一一对应,对应的两个位进行异或运算,两个位相同输出0不同输出1;
3、应用场景
除了上面介绍的跑马灯案例外,位运算还有什么实际的运用呢呢呢?位运算的高效与灵活,被广泛在在通讯与嵌入式领域使用。
拼字节
跟我们出去拼桌,拼车一样。嵌入式开发为了节约资源,经常需要在一个字节中存放多个数据。这种情况下,就要灵活的运用位运算,通过位移运算读取数据。
在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位。知识是一环扣一环得,这里还涉及到掩码,【思想】会另外找一期跟大家介绍什么是掩码!(小编到这里已经脑仁裂开了!!老铁们可以再坚持一下)
当然这种用法不仅仅用在CAN矩阵报文赋值中,其实在MCU的寄存器操作也可以广泛运用。上诉是某芯片的用户手册对寄存器的描述,可以看到一个字节不同的为描述不同的寄存器。
加密
利用异或运算加密是一种最简单的加密手段,原始值通过与秘钥异或加密得到密文,只要在跟这个秘钥再进行一次异或预算就会还原原始值
原文0x3与0x8异或运算得到密文0xB,密文0xB再与0x8异或运算解密的0x03
- 跟【思想】一起,在家里玩HIL(VCU仿真实例)
- 跟【思想】一起,在家里玩HIL(1)
- 【旁门左道】提取万有特性数据
- 动力经济性信息系统(2)
- 动力经济性信息系统(1)
- CRUISE&CRUISE M傻傻分不清楚
- 换挡策略如何影响动力经济性
- Amesim电动车仿真
- Amesim与Simulink联合仿真演示
- Amesim与Simulink联合仿真
- 增程式发动机仿真控制逻辑详解(二)
- 增程式发动机仿真控制逻辑详解(一)
- 增程式混合动力系统动力经济性仿真
- 工况路谱的采集与数据处理
- 路谱数据滤波工具
- 混合动力节油的秘密-发动机万有特性
- AVL-CRUISE纯电动仿真策略提高教程
- AVL-CRUISE纯电动模型仿真策略
- 燃料电池车(FCHEV)动力经济性建模与仿真
- CRUISE与Isight联合仿真优化
- CRUISE与Simulink联合仿真介绍
- 部分仿真软件对比介绍
- 体验整车控制器程序设计
- 永磁同步电机是什么?
- 【科普】整车控制器-软件篇
- 【科普】整车控制器-硬件篇
- Simulink中浮点数的优化表示法
- 嵌入式C语言中CAN报文字节序问题的处理方法
- 嵌入式C语言环境下的CAN总线通讯协议
- Simulink代码生成提高教程
- S-Funciton应用实例
- 汽车工程师眼中的C#
- Simulink代码生成应用教程
- Sinmulink代码生成基础体验教程
- CAN总线(J1939)速成指南【1】
- DBC文件助手~三月累计更新
- DBC文件助手-基础功能介绍2
- DBC文件助手-基础功能介绍1
- 路谱数据滤波工具
- Excel与DBC文件的互相转换
- 电机效率MAP生成工具