欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

不使用中间值交换两个变量的值方法及其原理

时间:2023-04-27

目录

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

异或和加法的关系:在伽罗华域上加减运算等价,即异或运算

异或运算可以看做是在本位上忽略进位的的相加。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。