目录
1.常规方法
2.使用加法
3.使用^来实现
1.常规方法
在平时时我们要交换两个变量的值时,我们常常使用暂存变量来保存中间数,以此来实现交换两个变量的值,这种方法简单且易实现。
void change(char* p1, char* p2){int tmp = 0;tmp = *p1;*p1 = *p2;*p2 = tmp;}
2.使用加法
这个方法的原理很简单就是使用了一点加法知识。
void change(char* p1, char* p2){*p1 = *p1 + *p2;*p2 = *p1 - *p2;*p1 = *p1 - *p2;}
由代码可见,这个方法是将两个值的和存放在*p1中,然后用*p2存放和减去*p2的值得到即是原来*p1的值,最后用*p1存放和减去*p2的值得到的即是原来*p2的值,如此便交换了两个变量的值
即 sum=a+b;*p1=a,*p2=b;
过程中的发展:*p2=(a+b)-b=a;
*p1=(a+b)-a=b。
3.使用^的方法
这种方法巧妙的使用了异或来达成目的。
void change(char* p1, char* p2){*p1 = *p1 ^ *p2;*p2 = *p1 ^ *p2;*p1 = *p1 ^ *p2;}
首先我们来看下这一过程中的变化
*p1=a;*p2=b;a=1011,
b=0110;
*p1=*p1^*p2 =1101;
*p2=*p1^*p2 =1011;
*p1=*p1^*p2 =0110;
异或操作可以理解为相异为真,相同为假,当使用第一轮异或的时候就是将两个数的真假信息存放在了一个变量中,第二轮异或即是将a的值解码出来给*p2,第三轮异或则是将b的值解码出来给*p。
这是利用了异或的自反性:a ^ b ^ a = b
异或和加法的关系:在伽罗华域上加减运算等价,即异或运算
异或运算可以看做是在本位上忽略进位的的相加。