• 不能创建第三个变量,实现两个数的交换


    目录

    常规实现两个数的交换(如:交换变量a和变量b)

    方法一:加减法

    方法二:异或操作符


    常规实现两个数的交换(如:交换变量a和变量b)

    创建一个临时变量tmp,先将其中一个变量a存放在临时变量tmp中,此时变量a的值则可被替换为变量b,然后再将b的值替换为tmp,此时变量a和变量b的值借助于变量tmp就完成了交换

    代码如下(以a、b为整型变量为例):

    1. #include
    2. int main()
    3. {
    4. int a = 3;
    5. int b = 5;
    6. printf("交换前:a = %d; b = %d\n", a, b);
    7. int tmp = a;
    8. a = b;
    9. b = tmp;
    10. printf("交换后:a = %d; b = %d\n", a, b);
    11. return 0;
    12. }

    代码验证如下:


    那不能创建临时变量又该如何交换两个变量的值呢,方法如下:

    方法一:加减法

    代码如下:

    1. #include<stdio.h>
    2. int main()
    3. {
    4. int a = 3;
    5. int b = 5;
    6. printf("交换前:a = %d; b = %d\n", a, b);
    7. a = a + b;
    8. b = a - b;
    9. a = a - b;
    10. printf("交换后:a = %d; b = %d\n", a, b);
    11. return 0;
    12. }

    代码讲解: 

    a = a + b:先将a与b的和存放在a中

    b = a - b:此时的a就为变量a、b的和,a减去b得到的就是a原来的值,然后赋值给b

    a = a - b:此时的b为原来a的值,那么a减去b得到的就是原来b的值,最后赋值给a

    这样就实现了变量a、b的交换

    代码验证:

    方法一的缺陷: 

    当变量a的值和变量b的值近乎于整型能表达的最大值

    此时a加上b的值就超出了整型能表示的最大值,再赋值给a的话就会发生截断

    从而就达不到交换的效果


    方法二:异或操作

    异或操作符相关的知识请见:按位与、或、异或操作符-CSDN博客

    代码如下:

    1. #include
    2. int main()
    3. {
    4. int a = 3;
    5. int b = 5;
    6. printf("交换前:a = %d; b = %d\n", a, b);
    7. a = a ^ b;
    8. b = a ^ b;
    9. a = a ^ b;
    10. printf("交换后:a = %d; b = %d\n", a, b);
    11. return 0;
    12. }

    异或操作符的相关运算

    异或操作符运算规则:对应的二进制位相同为0,相异为1

    a ^ a:得到的结果为0,因为对应的二进制位全相同

    结论:任意整型变量自己异或自己时,得到的结果为0

    a ^ 0:得到的结果为a

    结论:任意整型变量异或0还是得本身

    a ^ b ^ a:得到的结果为b

    a ^ a ^ b:得到的结果为b

    结论:异或操作符是支持交换律的

    代码讲解:

    由以上的结论即可推导出代码是如何实现的

    a = a ^ b:将a ^ b存放在变量a中

    b = a ^ b:此时的a为a ^ b,原代码可替换为:b = a ^ b ^ b,由以上结论就可得出b = a

    a = a ^ b:此时的a还是为a ^ b,此时的b已经被赋值为了a,所以原代码可替换为:a = a ^ b ^ a,由以上结论就可得出a = b

    代码验证:

    方法二的优点: 

    不论变量a或者b为多么大的值,都不会产生溢出或者截断的情况

    因为使用异或操作符操作的是二进制位,且不会出现进位的情况


    总结:

    方法二的可读性不高,且不易理解

    所以在常规实现两个变量的交换时,使用创建tmp变量进行交换即可

  • 相关阅读:
    【k8s】Pod 的钩子
    pod调度
    Python自动化小技巧11——excel文件的文字内容筛选
    IPV6 无状态(SLAAC)获取IP地址
    Vc - Qt - “扩张“的窗口
    PV操作-同步与互斥
    【异常检测】数据挖掘领域常用异常检测算法总结以及原理解析(一)
    skdaima
    详解TCP/IP的三次握手和四次挥手
    redis 常用方法
  • 原文地址:https://blog.csdn.net/weixin_55341642/article/details/140041273