分析交换两个整数的特殊写法
来源:互联网 发布:latex windows 10 编辑:程序博客网 时间:2024/05/22 13:46
今天晚上看CSDN博客时,勾起了我对交换两个整数写法的思考,当然这是一个非常简单的问题,因为一个交换代码只有三行,初学者都能轻松些出来。今天我分析这个交换代码比较特殊,他利用位运算来交换两个数。代码如下:a ^= b; b ^= a; a ^= b;将三个式子连写:a ^= b ^= a ^= b; 。我看到这种写法是我做acm时,我的队友这样写的,当时没对这个问题产生重视,由于百度面试遇到一个位运算题,加上今天看博客时别个用到了一个最简单的交换函数,让我联想到了这种比较奇怪的写法。下面就分析下这种奇怪写法的原理所在:将三句话写成如下等价形式:a = a ^b; ….(1) b = b ^ a; …..(2) a = a ^ b;…..(3)。将(1)带入到(2)中得到b=b^(a^b) ……(4),
由于异或与顺序无关,则(4)可以写成:b = b ^ b ^ a …..(5),
由异或的性质知道:b ^ b = 0,所以(5)进一步改写成b = 0^a,由性质0与任何数异或不改变其值,可知上式子等价于:b=a,由以上分析可得(1),(2)两句话将a的值放入b中,即执行了(1),(2)后b的值已经改变成a的值,剩下的问题就是如何将原来的b的值放入a中。由于(1)式中对a的值进行了修改,所以将(1)代入到(3)中得到:a = (a^b)^b1……(6),
这里我将(3)中的b写成b1是因为括号中的b是表示原来的b值,而(3)式中的b已经不是原来的b,由我们对(1),(2)的分析可知,执行了(1),(2)后b的值等于a,所以b1的值等于原来a的值,所以得到:a = (a^b)^a=a^a^b,进一步得到a=b。
最后(1)(2)(3)三句话可以合并为一句话:a ^= b ^= a ^= b;
- 分析交换两个整数的特殊写法
- 关于两个整数的交换的几种写法
- 交换两个整数的值
- 两个整数变量的交换
- 交换两个整数的值
- 两个整数的交换方法
- 交换两个整数的值
- 一个32位整数任意两个比特位交换的宏定义写法
- 一个32位整数任意两个比特位交换的宏定义写法
- 交换两个数的特殊方法
- 交换两个数的特殊方法
- 交换两个整数的值 Java_Note
- 交换两个整数的方法比较
- Java实现两个整数变量的交换
- 交换两个整数的三种方法
- C语言交换两个整数的值
- 实现两个整数交换的宏程序
- 两个整数交换的3中方法
- 翻手算法
- 公司内部管理系统-用YII开发中遇到的问题(更新中...)
- 在剪切板中使用自定义格式的数据
- yocto project terms & 深入理解 BitBake
- Citrix_XenServer-6.1安装过程详解
- 分析交换两个整数的特殊写法
- 第六周项目四----用点类做成员的三角形类以及多文件组织的三角形类
- LINUX下java环境的设置
- 谈谈网络安全的ARP攻击防护以及工具分享
- 想学编程?这样开始
- 使用 Xcode 在越狱 iOS 设备上进行开发调试
- 安装LoadRunner时出现“计算机缺少vc2005_sp1_with_atl_fix_redist”的解决办法
- Oracle触发器4-数据库事件触发器
- 智能指针(指向转移写法)