码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 不能创建第三个变量,实现两个数的交换


    目录

    常规实现两个数的交换(如:交换变量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变量进行交换即可

  • 相关阅读:
    红队web打点信息收集
    12.9-测试类型:回归测试、按关联代码划分、按实施主体划分、按工程阶段划分、按执行代码划分、按质量特性划分、按符合性情况划分
    视频监控系统/安防视频平台EasyCVR广场视频细节优化
    1035 Password
    CGMH: Constrained Sentence Generation by Metropolis-Hastings Sampling
    垂起固定翼无人机基础知识,垂起固定翼无人机应用前景,垂起固定翼无人机优缺点分析
    C#面向抽象编程第二讲
    电商API知识问答
    10-集合3-Map
    【PL理论】(3) F# 数据类型:变量类型 | F# 操作符 | 定义函数 | 使用定义的函数 | if-then-else 表达式:绝对不能省略 else 部分,除非表达式是 unit 类型
  • 原文地址:https://blog.csdn.net/weixin_55341642/article/details/140041273
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号