不用第三个变量,交换两个变量的值三种方案详解

2024-06-06 10:18

本文主要是介绍不用第三个变量,交换两个变量的值三种方案详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Change two varible's value without the third varible


update: 2014.12.14(找到了第三种方案,简直...搞笑)

通常,交换两个变量的值的技巧就是多用一个中间变量。
source code:
#include<stdio.h>
#include<stdlib.h>int main()
{int varible_1 = 10;int varible_2 = 20;int temp = 0;//the third varibleprintf("before changing value:\nvarible_1 = %d,varible_2 = %d\n",varible_1,varible_2);temp = varible_1;varible_1 = varible_2;varible_2 = temp;printf("after changing value:\nvarible_1 = %d,varible_2 = %d\n",varible_1,varible_2);return 0;
}
jasonleaster@ubuntu:~/Desktop$ ./a.out
before changing value:
varible_1 = 10,varible_2 = 20
after changing value:
varible_1 = 20,varible_2 = 10


我是听说这个问题是面试官出的,于是留意了一下。

方案一


一目了然的感觉!有木有!
最根本的思想是保留两个数据之间的“距离”,然后保持另外一个变量不变,就能交换这两个变量。
具体的操作
a = a - b;//step one 把ab之间的距离储存在a中,以丢失a的信息为代价,但是保持b不变
b = a + b;//step two 此时a是ab之间的距离。当a在b的右侧, step two时a就是大于0的数,于是b =  a+b就变成原来的a了!
a = b - a;// step three.此时等式右边,利用a是原来两点之间的距离,b变成了原来的a,于是b - 原来的距离差,就是原来的b了
source code:
#include<stdio.h>
#include<stdlib.h>int main()
{int varible_1 = 10;int varible_2 = 20;printf("before changing value:\nvarible_1 = %d,varible_2 = %d\n",varible_1,varible_2);varible_1 = varible_1 - varible_2;varible_2 = varible_2 + varible_1;varible_1 = varible_2 - varible_1;printf("after changing value:\nvarible_1 = %d,varible_2 = %d\n",varible_1,varible_2);return 0;
}

jasonleaster@ubuntu:~/Desktop$ ./b.out
before changing value:
varible_1 = 10,varible_2 = 20
after changing value:
varible_1 = 20,varible_2 = 10

方案二:


位运算是个很有意思,很好玩的东西。 ----  ^

a ^ b == a异或b

0x01101001  ^ 0x 11000011 = 0x10101010

额。。。这个1010绝对是巧合。。。我随手敲出的数字,然后算的,just a demo

异或运算的几种特殊情况:
a^a = 0; //很明显咯
a^0 = a;//a 和 0做异或运算,等于本身
a^F = ~a;//这里F用来表示和a长度一致的位全1变量。a和所有位都是1的变量做异或运算,得到a的反

test :
a = 0x0101

a^a = 0x0000;
a^0x0000 = 0101;
a^0x1111 = 1010;

It‘s so obvious :-)

理解如下方法,始终要记住异或运算旨在保留两变量的“对应位相同与否”的这个信息!

重点来鸟:
a = a^b;//step one 这个语句完成后,a保存了很重要的信息,a,b对应位相同与否的信息被保存在a之中了,于此同时,b的信息未被损坏,a的信息丢失。
b = a^b;//step two 此时利用a变量个个位的信息做参照(因为a保留了ab之间的联系信息,异或),于是对a^b;做异或运算,可以得到a;同样还可以这样理解(a^b)^b  = a^(b^b) = a^0 = a; 然后赋值给b,此时b变成原来初始的a
a = a^b;//step three 还是利用a保留了ab之间联系信息(异或),于是有(a^b)^(a^b)^b = a^a^b = b;


It was done!
  
source code:
#include<stdio.h>
#include<stdlib.h>int main()
{int varible_1 = 10;int varible_2 = 20;printf("before changing value:\nvarible_1 = %d,varible_2 = %d\n",varible_1,varible_2);varible_1 = varible_1 ^ varible_2;varible_2 = varible_1 ^ varible_2;varible_1 = varible_1 ^ varible_2;printf("after changing value:\nvarible_1 = %d,varible_2 = %d\n",varible_1,varible_2);return 0;
}

jasonleaster@ubuntu:~/Desktop$ ./c.out
before changing value:
varible_1 = 10,varible_2 = 20
after changing value:
varible_1 = 20,varible_2 = 10





方案三:
a = 1;
b = 2;
a = a*b;
b = a/b;
a = a/b;
今天才看到这方法...简直搞笑...

If there is something wrong with my explaination, please touch me by e-mail jasonleaster@gmail.com.
Thank you and wish my blog will help you.


















这篇关于不用第三个变量,交换两个变量的值三种方案详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035829

相关文章

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

MySQL8 密码强度评估与配置详解

《MySQL8密码强度评估与配置详解》MySQL8默认启用密码强度插件,实施MEDIUM策略(长度8、含数字/字母/特殊字符),支持动态调整与配置文件设置,推荐使用STRONG策略并定期更新密码以提... 目录一、mysql 8 密码强度评估机制1.核心插件:validate_password2.密码策略级

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方