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

目录

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

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

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值