从单片机基础到程序框架(全集 2019pdf版).pdf - 第135页

第三十二节:逻辑运算符的“异或”运算。 【32.1 “异或”运算。 】 “异或” 运算 也是以位为单 位进行运算 的。 位是 指二进制中 的某一 位, 位只能是 0 或者 1 。 两个数的 “异 或”运算就是转 换成二进制后 每一位的 “异或” 运算。 “异或 ”运 算的符 号是 “^” 。运算规 律是 :两 个位 的“ 异或 ”运算 ,如 果两个 位都 相同 ,那么 运算 结果 就是 0;如果两个 位不同 (相异) ,则运算结 果是 …

100%1 / 836
十六进制:D
二进制:1101
2 个数
十进制:85
十六进制:55
二进制:1010101
3 个数
十进制:13
十六进制:D
二进制:1101
分析:
通过实验结果,发现在单片机上的计算结果和我们的分析是一致的。
【31.4 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改C 语言学习区域”代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口 51 习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。
第三十二节:逻辑运算符的“异或”运算。
【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 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下: