交换两个整数的“技巧”

一直一来,坊间流传着交换两个整数(int)的三个方法。第一种方法是最普通的方法,使用了一个临时变量,如下所示:

另外还有两种“技巧”,是不用临时变量的方法。分别为使用加减法的方法:

和使用了异或运算的方法:

这两种“技巧”,由于没有使用临时变量,显得高大上起来,甚至出现在笔试题,面试题中。那么,这三种方法的性能比较如何呢?

我采用了下面这段代码来测试性能:

编译器为 GCC 4.9.2(Mac),写了一段脚本,运行这段代码十次,并用 time 命令来统计了时间,结果如下:

可以看出,性能最高的是最普通的方法,两个“技巧”性能都比较差。其中使用了异或运算的方法,由于是位运算,我在做实验之前觉得应该会比较快,结果它是最慢的。

其实这两个“技巧”还有个问题,就是当 a,b 相等(两个整数的地址相同)时,会出现意想不到的情况。当 a,b 相等时,使用了加减运算的方法会变为:

使用了异或运算的方法会变为:

可以看出,这两个“技巧”当 a,b 相等时,结果 *a,*b 都会变为零。为了防止这种情况,首先需要在函数里面判断 a 是否等于 b,如果 a 和 b 相等,则不做任何交换。

结论:这两个“技巧”不但性能不好,还有前面所说的 bug。这种“技巧”,不要也罢!

3 thoughts on “交换两个整数的“技巧”

Leave a Reply to peterchou139 Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">