合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
【32.1 “异或”运算。】 “异或”运算也是以位为单位进行运算的。位是指二进制中的某一位,位只能是0或者1。两个数的“异或”运算就是转换成二进制后每一位的“异或”运算。 “异或”运算的符号是“^”。运算规律是:两个位的“异或”运算,如果两个位都相同,那么运算结果就是0;如果两个位不同(相异),则运算结果是1。比如: 0^0等于0。(两个位相同) 0^1等于1。(两个位相异) 1^0等于1。(两个位相异) 1^1等于0。(两个位相同) 现在举一个完整的例子来分析“^”运算的规律。有两个unsigned char类型的十进制数分别是12和9,求12^9的结果是多少?分析步骤如下: 第一步:先把参与运算的两个数以二进制的格式展开。十进制转二进制的方法请参考前面第14,15,16节的内容。 十进制12的二进制格式是:00001100。 十进制9的二进制格式是: 00001001。 第二步:二进制数右对齐,按上下每一位进行“异或”运算。 十进制的12 -> 00001100 十进制的9 -> ^00001001 “异或”运算结果是 -> 00000101 第三步:把二进制的 00000101转换成十六进制是:0x05。转换成十进制是5。所以12^9的结果是5。 【32.2 “异或”在项目中的应用。】 “异或”在哪些项目上经常应用?以我个人的项目经验,平时很少用“异或”,我本人在项目中用过两次“异或”,第一次是在某项目做串口通讯协议时,通过“异或”算法,增加一个校验字节,此校验字节是一串数据依次相“异或”的总结果,目的是为了增加数据传送时的抗干扰能力。第二次是把它用来对某变量的某个位进行取反运算,如何用“异或”来实现对某位进行取反的功能?要实现这个功能,首先要清楚“异或”运算有一个潜在的规律:任何一个位,凡是与0进行“异或”运算都保持不变,凡是与1进行“异或”运算都会达到取反的运算效果。因此,如果想某位实现取反的功能,只要把相关的位与“1”进行“异或”运算就可以实现取反的功能。二进制中的一个位要么是0,要么是1,不管是0还是1,只要与1进行“异或”运算,是会达到取反的运算目的,0的会变成1,1的会变成0。请看以下这个例子: 0^1等于1。(两个位相异) 1^1等于0。(两个位相同) 以上的例子只是列举了一个位,如果把一个字节的8位展开来,只要某位与“1”进行“异或”运算,都可以实现某位取反的功能。比如,一个十六进制的0x55,如果要这个字节的低4位都取反,高4位不变,只需要把该数据与十六进制的0x0F进行“异或”运算就可以达到目的。请看以下这个例子: 十六进制的0x55 -> 01010101 十六进制的0x0F -> ^00001111 “异或”运算结果是 -> 01011010 上述运算结果二进制的01011010转换成十六进制是0x5A,转换成十进制是90。 【32.3 异或运算的“自异或简写”。】 当被异或数是“保存变量”时,存在“自异或简写”。 “保存变量”=“保存变量” ^ “某数” ; 上述自异或简写如下: “保存变量” ^ =“某数” ; 比如: unsigned char c=9; c^=5; //相当于c=c^5; 最后的计算结果c是12。 【32.4 例程练习和分析。】 现在编写一个程序来验证刚才讲到的“异或”运算: 程序代码如下: /\*---C语言学习区域的开始。-----------------------------------------------\*/ void main() //主函数 { unsigned char a; unsigned char b; unsigned char c=9; a=12^9; b=0x55^0x0F; c^=5; //相当于c=c^5; 最后的计算结果c是12。 View(a); //把第1个数a发送到电脑端的串口助手软件上观察。 View(b); //把第2个数b发送到电脑端的串口助手软件上观察。 View(c); //把第3个数c发送到电脑端的串口助手软件上观察。 while(1) { } } /\*---C语言学习区域的结束。-----------------------------------------------\*/ 在电脑串口助手软件上观察到的程序执行现象如下: 开始... 第1个数 十进制:5 十六进制:5 二进制:101 第2个数 十进制:90 十六进制:5A 二进制:1011010 第3个数 十进制:12 十六进制:C 二进制:1100 分析: 通过实验结果,发现在单片机上的计算结果和我们的分析是一致的。 【32.5 如何在单片机上练习本章节C语言程序?】 直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C语言学习区域”的代码就可以了,其它部分的代码不要动。编译后,把程序下载进带串口的51学习板,通过电脑端的串口助手软件就可以观察到不同的变量数值,详细方法请看第十一节内容。