两个数据交换在编程中很常用,比如排序算法中就经常要用到,下面介绍常用的三种方法,并对它们的效率作出对比,以便在大量用到交换的程序中提高效率。
第一种方法,使用一个临时temp,代码如下:
int a1 = 3; int a2 = 5;
int temp;
temp = a1;
a1 = a2;
a2 = temp;
第二种方法,直接不用额外的存储空间,直接在两个数据上操作,但是这种方法有可能在两个数相加时产生越界的问题。代码如下:
int b1 = 3; int b2 = 5;
//b1 = b1 + b2
//b2 = b1 + b2 - b2 = b1
//b1 = b1 + b2 - (b1 + b2 - b2) =b2
b1 = b1 + b2;
b2 = b1 - b2;
b1 = b1 - b2;
第三种方法是使用异或运算符 亦或运算
int c1 = 3; int c2 = 5;
// a=a^b;
// b=b^a;
// a=a^b;
c1 ^= c2;
c2 ^= c1;
c1 ^= c2;
亦或计算口诀:相同取0,相异取1
现实中用的都是十进制的数值
1101.01(2)=1*20+0*21+1*22+1*23 +0*2-1+1*2-2=1+0+4+8+0+0.25=13.25(10)
那么我们来看一看两个十进制数值是怎么进行异或计算:
5 ⊕ 3 = ?
1.进行异或计算前会把数值都转换为二进制:
5和3转为二进制分别为:0101 、0011
0101
xor 0011
————
结果 0110
2.再把结果 0110 转换为十进制的:6
3.所以 5 ⊕ 3 = 6
通过我的程序运行对比,得到以下结果:
结果显示,第一种方法效率是最高的,虽然第一种方法占据一个额外的内存空间,但是交换的三行代码实现的都是赋值操作,相对后两种的加减和异或要快很多。所以,当交换量大时,推荐用第一种方法,速度快,而且最容易理解。其次是第三种方法比较快,最次的是第二种方法,不过第二种方法和第三种方法的效率相差不多。
网友评论