c语言不用临时变量交换两个数程序分析
首先看这样一个程序
int a, b;
a = a + b;
b = a - b; 此时b = (a + b) - b = a; (经过第一步a为a+b)
a = a - b; 此时a = (a + b) - a = b; (经过第二步时b已为a)
可见这个程序实现了a和b的交换。注意+和-互为逆运算,可以得到(a+b)-b=a,埋个伏笔先。
在看这个例子:
int a, b;
a = a ^ b;
b = a ^ b;
a = a ^b;
这样也可以实现a和b的交换,是不是比较诡异。分析一下就很容易明白为什么可以这么实现了。
首先需要熟悉位运算关于异或^的知识,异或即对应位相同为0,相异为1.假设a为一个二进制位只能取0和1,可以得到这样几个恒等式:
a ^ 1 = !a. 把a分别当做0和1,自己运算一下很容易得到这个。
a ^ 0 = a. 还是把a分别当做0和1,自己运算一下很容易得到这个。
a ^ a = 0. 这个更容易了,每一位都相同,结果肯定为0.
再来看看这个(a^b)^b = a,这个说明了什么,其实异或^的逆运算就是本身,现在利用上面三个公式就可以证明这个公式。分别令b为0和1,当b为0时,(a^0)^0=a^0=a, 当b为1,(a^1)^1 = !(!a)=a。证毕。(注意a当成二进制位所以!(!a)成立)
再回头看为什么可以用异或交换两个数字:
a = a ^ b;
b = a ^ b; (b=a^b=(a^b)^b=a),此时b被赋值为a
a = a ^ b; (a=a^b=(a^b)^a=(b^a)^a=b),此时a被赋值为b,注意异或满足交换律)
现在就很容易理解了。
推广:
实际上,如果定义两个满足逆运算的符号#,@,(a#b)@b=a,
a = a # b;
b = a @ b;
a = a @ y;
都可以实现a和b的交换。
转载于:https://www.cnblogs.com/PegasusWang/archive/2013/05/08/3066560.html
c语言不用临时变量交换两个数程序分析相关推荐
- 不创建临时变量交换两个数,这才是高手
不创建临时变量交换两个数?这才是高手 1.基本介绍 1.代码编写 总结 1.基本介绍 交换两个数,想必大家都很熟悉,也很容易写出来就可以实现,即创建一个临时变量,就可以完成两个数的交换,然后更牛逼的大 ...
- C语言不用临时变量交换a,b的值
现在有个题是: 要求不创建临时变量,来交换a,b的值,问有几种办法 首先先来一个创建临时变量交换的 int temp=0;temp=a;a=b;b=temp; 相信大家也都会,哈哈哈,就不多讲了 加减 ...
- 不用临时变量交换两个变量的值
在学习C语言的时候,涉及到两个变量值的交换,其中用到临时变量. 类似于: temp=a;a=b;b=temp; 这样的语句,如果在没有临时变量的情况下,该如何做呢? 网络上的人们给出了两种方法: 一. ...
- C语言异或交换两个数的原理解析-大厂面试题:不使用第三变量交换两个数的值
常用操作交换两个数的值 常用的交换两个数值的方法一般是采用第三个变量,这种方法简单易懂,用代码举例 int main() {//交换两个整形变量int a = 3;int b = 5;int c = ...
- 不用额外变量交换两个整数的值
题目 如何不用任何额外变量交换两个整数的值 基本思路 如果给定整数a和b使用如下三行代码即可交换a和b的值: a = a ^ b b = a ^ b a = a ^ b 如何理解这三行代码的具体功能呢 ...
- 不允许创建临时变量交换两个变量的内容
在学习C语言的时候,涉及到两个变量值的交换,其中用到临时变量.如果在没有临时变量的情况下,该如何做呢? 方法一:C语言提供的异或运算就可以实现这样的操作.异或运算符"^"也称&qu ...
- C++:不用申请变量交换两个变量的值
zz:http://yangjiayu.com/archives/83 http://hi.baidu.com/sunjoe/blog/item/895aa809d916fb226b60fba5.ht ...
- 不借助第三个变量交换两个整数
假设两个数x和y,则有: 方法1,算术运算(加减): x=x+y; //x暂存两数之和 y=x-y; //y为两数之和减去y,即原来的x x=x-y; //x为两数之和减去现在的y(原来的x), ...
- C++实现1.交换两个整形变量的内容.2.不创建临时变量的条件下,交换两个数的内容.3.求是个整数中的最大值.4.将三个数按从大到小输出.5.求两个数的最大公约数.
/ //给定两个整型变量的值,并交换他们的值 int main(){ int a = 10; int b = 20; int temp = a; //创建一个临时变量,来做交换值的中间媒介 a = b ...
- 不用临时变量,交换两个变量的值
不用临时变量,交换两个变量的值 a=a^b; b=a^b; a=a^b; 或者 a=a+b; b=a-b; a=a-b;
最新文章
- android有用的知识
- 通过describe命令学习Kubernetes的pod属性详解
- 安装、登录centos7
- python二十三:生产者 消费者模型
- Git学习笔记:分支管理(1)
- react+redux使用static mapStoreToProps
- 深度剖析Service Mesh服务网格新生代Istio
- WAI-ARIA对自动完成小部件的支持
- 修改软件许可证使用时间_阮一峰:为什么开源数据库改变许可证?
- flyway配置mysql_Flyway快速上手教程
- nginx工作笔记004---配置https_ssl证书_视频服务器接口等
- mysql 定期删除表中无用数据
- [转载]Mysql导出表结构及表数据 mysqldump用法
- .NetCore Redis使用及帮助类
- pip不是内部命令问题
- 零售销售数据分析案例实战
- 时间序列预测 | Python实现GAN时间序列数据生成建模
- 1024程序员节,160元买400元图书专属优惠券,速来
- 网易互娱招聘 | 遇见offer之就要圆你的大厂梦
- 记一次Process finished with exit code 1 项目异常
热门文章
- 为 WE 打 Call!
- ActiveMQ下载与安装(Linux环境下进行)
- [tldk][dpdk][dev] TLDK--基于dpdk的用户态协议栈传输层组件简单调研
- 你看,那个人好像一条狗哎
- BZOJ 3744: Gty的妹子序列 [分块]
- IIS+PHP本地开发环境配置
- UVa232.Crossword Answers
- iOS The run destination iPhone is not valid for Running the scheme ‘项目名‘
- 前端响应式のmedia文件分离
- HTML 转 PDF的两种实现方式