首先看这样一个程序

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.代码编写 总结 1.基本介绍 交换两个数,想必大家都很熟悉,也很容易写出来就可以实现,即创建一个临时变量,就可以完成两个数的交换,然后更牛逼的大 ...

  2. C语言不用临时变量交换a,b的值

    现在有个题是: 要求不创建临时变量,来交换a,b的值,问有几种办法 首先先来一个创建临时变量交换的 int temp=0;temp=a;a=b;b=temp; 相信大家也都会,哈哈哈,就不多讲了 加减 ...

  3. 不用临时变量交换两个变量的值

    在学习C语言的时候,涉及到两个变量值的交换,其中用到临时变量. 类似于: temp=a;a=b;b=temp; 这样的语句,如果在没有临时变量的情况下,该如何做呢? 网络上的人们给出了两种方法: 一. ...

  4. C语言异或交换两个数的原理解析-大厂面试题:不使用第三变量交换两个数的值

    常用操作交换两个数的值 常用的交换两个数值的方法一般是采用第三个变量,这种方法简单易懂,用代码举例 int main() {//交换两个整形变量int a = 3;int b = 5;int c = ...

  5. 不用额外变量交换两个整数的值

    题目 如何不用任何额外变量交换两个整数的值 基本思路 如果给定整数a和b使用如下三行代码即可交换a和b的值: a = a ^ b b = a ^ b a = a ^ b 如何理解这三行代码的具体功能呢 ...

  6. 不允许创建临时变量交换两个变量的内容

    在学习C语言的时候,涉及到两个变量值的交换,其中用到临时变量.如果在没有临时变量的情况下,该如何做呢? 方法一:C语言提供的异或运算就可以实现这样的操作.异或运算符"^"也称&qu ...

  7. C++:不用申请变量交换两个变量的值

    zz:http://yangjiayu.com/archives/83 http://hi.baidu.com/sunjoe/blog/item/895aa809d916fb226b60fba5.ht ...

  8. 不借助第三个变量交换两个整数

    假设两个数x和y,则有: 方法1,算术运算(加减): x=x+y;  //x暂存两数之和 y=x-y;  //y为两数之和减去y,即原来的x x=x-y;  //x为两数之和减去现在的y(原来的x), ...

  9. C++实现1.交换两个整形变量的内容.2.不创建临时变量的条件下,交换两个数的内容.3.求是个整数中的最大值.4.将三个数按从大到小输出.5.求两个数的最大公约数.

    / //给定两个整型变量的值,并交换他们的值 int main(){ int a = 10; int b = 20; int temp = a; //创建一个临时变量,来做交换值的中间媒介 a = b ...

  10. 不用临时变量,交换两个变量的值

    不用临时变量,交换两个变量的值 a=a^b;     b=a^b;     a=a^b; 或者   a=a+b;     b=a-b;     a=a-b;

最新文章

  1. android有用的知识
  2. 通过describe命令学习Kubernetes的pod属性详解
  3. 安装、登录centos7
  4. python二十三:生产者 消费者模型
  5. Git学习笔记:分支管理(1)
  6. react+redux使用static mapStoreToProps
  7. 深度剖析Service Mesh服务网格新生代Istio
  8. WAI-ARIA对自动完成小部件的支持
  9. 修改软件许可证使用时间_阮一峰:为什么开源数据库改变许可证?
  10. flyway配置mysql_Flyway快速上手教程
  11. nginx工作笔记004---配置https_ssl证书_视频服务器接口等
  12. mysql 定期删除表中无用数据
  13. [转载]Mysql导出表结构及表数据 mysqldump用法
  14. .NetCore Redis使用及帮助类
  15. pip不是内部命令问题
  16. 零售销售数据分析案例实战
  17. 时间序列预测 | Python实现GAN时间序列数据生成建模
  18. 1024程序员节,160元买400元图书专属优惠券,速来
  19. 网易互娱招聘 | 遇见offer之就要圆你的大厂梦
  20. 记一次Process finished with exit code 1 项目异常

热门文章

  1. 为 WE 打 Call!
  2. ActiveMQ下载与安装(Linux环境下进行)
  3. [tldk][dpdk][dev] TLDK--基于dpdk的用户态协议栈传输层组件简单调研
  4. 你看,那个人好像一条狗哎
  5. BZOJ 3744: Gty的妹子序列 [分块]
  6. IIS+PHP本地开发环境配置
  7. UVa232.Crossword Answers
  8. iOS The run destination iPhone is not valid for Running the scheme ‘项目名‘
  9. 前端响应式のmedia文件分离
  10. HTML 转 PDF的两种实现方式