A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cjfire 中级黑马   /  2014-8-7 14:19  /  2050 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在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。

11 个回复

倒序浏览
第二个方法的确是个好方法,在以后的估计也能用的到
<a=a^b;
b=a^b;//b=a^b^b;两个相同的数异或,结果为0,一个数和0进行异或,结果等于原来的数值,则b==a;
a=a^b;//a=a^b^a,则a==b
>
回复 使用道具 举报
恩,  第二种方法确定解析得很好. 在C语言里进制这玩意还是要玩玩的. 特别是考虑到占用的内存空间时.
回复 使用道具 举报
这些hack的方式实际中几乎用不到,可读性和可调试性差不说,还可能降低运行效率。主要是面试、笔试中可能会遇到
回复 使用道具 举报
过来看看
回复 使用道具 举报
这种思维方式很好,但是感觉用处不大~~~
回复 使用道具 举报
视频仲提到的一道题目
回复 使用道具 举报
提高逻辑思维
回复 使用道具 举报
好东西,第一种看的时候整理了,居然还有第三种。。。。。
回复 使用道具 举报
朱亚男 来自手机 中级黑马 2014-9-4 20:21:15
10#
不错!,,
回复 使用道具 举报
还可以借第三方变量
int a,b ;
int c = a+b;
a = c -a;
b = c -b;
这个最简单了。。。
回复 使用道具 举报
厉害啊,没想过用异或这种办法。再问,异或和算术比,那个性能好呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马