黑马程序员技术交流社区

标题: 不使用第三个变量,对两个数进行置换 [打印本页]

作者: cjfire    时间: 2014-8-7 14:19
标题: 不使用第三个变量,对两个数进行置换
在C中,经常会用到置换,一般情况下,我们都会借助第三个变量进行置换,但是如果你要置换的是两个数字,那么,就有一些节省空间开支的方法了。下面,我列两种常见方法:
1,通过算数
int a,b;
a=b-a;
b=b-a;
a=b+a;
2、异或
a^=b;
b^=a;
a^=b;
对于第一种方法,很好理解,而第二种方法,可能会有些难理解,我说说我的理解。
既然不能用第三个变量,那么a和b中,肯定要毁掉一个变量来进行置换,那么,a和b异或产生了一个数,这个数是异或得到,我们知道,异或的算法是,相同为零,不同为一。也就是说,产生的数字准确的记录了a和b的哪些位相同,哪些位不同,这样,就可以通过b来还原a,也可以通过a来还原b。
作者: 陆习康    时间: 2014-8-7 14:59
第二个方法的确是个好方法,在以后的估计也能用的到
<a=a^b;
b=a^b;//b=a^b^b;两个相同的数异或,结果为0,一个数和0进行异或,结果等于原来的数值,则b==a;
a=a^b;//a=a^b^a,则a==b
>
作者: -(_)-    时间: 2014-8-7 16:20
恩,  第二种方法确定解析得很好. 在C语言里进制这玩意还是要玩玩的. 特别是考虑到占用的内存空间时.
作者: fantacyleo    时间: 2014-8-7 20:28
这些hack的方式实际中几乎用不到,可读性和可调试性差不说,还可能降低运行效率。主要是面试、笔试中可能会遇到
作者: 叮当    时间: 2014-9-3 22:10
过来看看
作者: zhuiyi007    时间: 2014-9-4 08:54
这种思维方式很好,但是感觉用处不大~~~
作者: 3677065    时间: 2014-9-4 17:43
视频仲提到的一道题目
作者: 冯大卫    时间: 2014-9-4 17:50
提高逻辑思维
作者: 达摩八戒    时间: 2014-9-4 19:57
好东西,第一种看的时候整理了,居然还有第三种。。。。。
作者: 朱亚男    时间: 2014-9-4 20:21
不错!,,
作者: 我说你是个逗比    时间: 2014-9-5 08:07
还可以借第三方变量
int a,b ;
int c = a+b;
a = c -a;
b = c -b;
这个最简单了。。。

作者: 崔石炫    时间: 2014-9-21 14:43
厉害啊,没想过用异或这种办法。再问,异或和算术比,那个性能好呢?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2