【技能点GET】关于不使用第三个变量实现两个变量值的交换

    前些天在翻阅C语言教材时,偶然瞥见这样一道题:如何在不使用第三个变量的情况下实现两个变量值的交换?当时看到这道题的时候一脸懵逼,想了好久也不知道该怎么办,于是后来去翻阅了习题答案,答案上给出的是算术运算的方法,就是利用代数变换实现值的互换。codes如下:

一、算数运算(几何理解)

#include<iostream>
using namespace std;
int main() 
{
   int a{3},b{5};
   a=b-a;   
   b=b-a;   
   a=a+b; 
   return 0;
}

这个确实很难想到,利用代数关系在运算中完成了交换,后来查阅在论坛上找到了另一个博主关于这个算法的另一种理解——几何方向的理解。首先我们可以将a,b两数看作数轴上的两个点:

 如图所示是a,b均为正数的情况,负数算出来取负号结果一致,这里就不再赘述。首先第一步a=b-a,计算出的是a,b之间的距离,将a,b之间的距离赋值给a,此时b的值还未改变,从数轴上可以看出,a到原点的距离可以由b到原点的距离减去a,b之间的距离得到,所以第二步b=b-a,这一步的a表示的是a,b之间的距离,b-a得到的就是a到原点的距离,赋值给b,此时b中存储的就是a的值了。接下来我们来理一下a,b之间的关系,a是原来a,b两点的距离,b是a到原点的距离,b比a大(这里假设),我们还差一步就是得到b的值,自然得到第三步a=a+b,这样一来我们就完成了两个变量值的交换在没有借助第三个变量的情况下。


二、位运算

    交换两个变量的值我们还可以利用计算机运算时的特性——位运算,众所周知,计算机在处理数字运算时,总是先将要进行运算的两个数字进行进制转换,转换为对应的二进制数进行相应的运算,而二进制又有其特有的位运算——与、或、非、异或、取反、移位六大运算,在这些运算符中我们关注到异或(~)运算,因为它不仅是一个双目运算符并且它独有的特性:一个数两次与同一个数进行异或运算等于这个数本身,也就是a^b^b=a,b^a^a=b,我们构造算式如下:

#include<iostream>
using namespace std;
int main()
{
 int a{3},b{5};
 a=a^b;
 b=a^b;
 a=b^a;
 return 0;
}

至此我们也就完成了两个数的交换,同样也没有借助第三个变量。 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林琊LinyaT052

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值