不用临时变量 实现两个变量之间的数据交换


最近看到了哈佛大学公开课:计算机科学cs50_用户体验,数组与指针,Hash函数_网易公开课
里面介绍了一个不用临时变量就可以实现两个变量之间的数据交换,好奇这是什么原因,所以找到了这篇文章,纯粹当做搬运工

使用异或交换数据值的原理 - borefo的专栏 - 博客频道 - CSDN.NET

源程序:

*a = *a ^ *b ;/此时*a 等价于c
*b = *a ^ *b;
*a = *a ^ *b ;/还原*a



大家都知道,假如有a,b两个整型数,我们可以用

a^=b;
b^=a;
a^=b;

来交换a,b的值,在这里我说说其中的原理:
^ 在 C 里面是按位异或操作符,相同的话异或的结果就是 0,不同的话就是 1。举个例子,比如 a 表示十进制的 5,b 表示十进制的 12,按位异或结果就是:

a = 0101   (5 的二进制表示)
b = 1100   (12 的二进制表示)
    ----
c = 1001   (结果为 9)
*a = *a ^ *b ;/此时*a 等价于c


可以看出 c 中是 1 的部分就是 a 和 b 二进制表示对应位不同的部分,0 则是相同的部分。

牢记以下两条原则:
任何一位二进制数同 1 异或都会变成另外一个(0 同 1 异或的结果是 1,1 同 1 异或的结果是 0)
任何一位二进制数同 0 异或都保持不变(0 同 0 异或的结果是 0,1 同 0 异或的结果是 1)


因为 c 中是 1 的部分表示 a 和 b 中按位不同的位,0 表示 a 和 b 中按位相同的位,那么 a 同 c 异或的结果就是 a 中与 b 不同的位发生变化,二进制数每位只有两种状态,所以 a 变成了 b:
a = 0101
c = 1001
    ----
b = 1100

*b = *a ^ *b;



同样, b 与 c 异或结果就变成了 a:
b = 1100
c = 1001
    ----
a = 0101

*a = *a ^ *b ;/还原*a

你可能感兴趣的:(单片机学习)