在很多时候,我们会使用到将两个整型变量值进行互换,比如冒泡排序,通过判断来将数组变量的值逐步交换,那么怎么交换值才能最有效最节省空间呢?
首先,我们会想到的,用一个零时变量来做中间的过度存储空间,这是很容易想到的方法,实现如下:
int i = 10; //声明变量 i,并给 i 赋值为10
int j = 20; //声明变量 j,并给 j 赋值为20
int temp; //声明零时变量temp
那么,我们要将变量 i 的值赋给变量 j ,就得通过零时变量temp存储其中一个变量的值:
temp = i ; //将变量 i 值暂存于零时变量temp中,即temp = 10;
i = j ; //将变量 j 的值赋值给变量 i ,即 i = 20;
j = temp ; //将零时变量存放的值赋值给变量 j ,即 j = 10;
这样,我们就完成了最简单的值互换。
其次,既然我们需要互换的是int类型的变量,那么就可以进行数值运算及加减乘除来实现变量值的互换。
int i = 10; //声明变量 i,并给 i 赋值为10
int j = 20; //声明变量 j,并给 j 赋值为20
i = i + j; //将 i + j(10+20) 的和赋值给变量 i ,赋值后变量 i 的值为 30
j = i - j; //将 i - j(30-20) 的差赋值给变量 j ,赋值后变量 j 的值为 10
i = i - j; //再运算一次,将 i - j(30 - 10)的差赋值给变量 i ,赋值后变量 i 的值为 20
这样,我们也完成了两个变量值的互换,这样的好处是不需要第三个变量参与,节省了运行内存。
最后,我们可以通过位运算中的异或运算(^)实现变量值的交换,异或运算是位运算,其规则是相同为0,不同为1,即1^0或0^1的取值为1,1^1或0^0的取值为0,实现如下:
int i = 10; //声明变量 i,并给 i 赋值为10
int j = 20; //声明变量 j,并给 j 赋值为20
//其中变量 i 的值为10,其二进制编码为:0000 1010
//其中变量 j 的值为20,其二进制编码为:0001 0100
i = i ^ j ; //即为 10 ^ 20 ,根据 ^ 的运算规则可知,其结果是 0001 1110 ,转换成十进制为:24 + 23 + 22 + 2 = 30 ,
//并将30赋值给变量 i ,即 i = 30
j = i ^ j ; //即为 30 ^ 20,其结果是 0000 1010,转换成十进制为10,并将结果赋值给变量 j ,即 j = 10
i = i ^ j ; //即为 30 ^ 10,其结果是 0001 0100,转换成十进制为20,并将结果赋值给变量 i ,即 i = 20
这种方式不需要使用零时变量,且是通过位运算,增加了其运算速度。
总结,在完成代码时,我们要在解决问题的同时思考更加高效率的解决方案,当然,我们也要明白不同方案的优点和缺点,虽然有些方案可以提高运行效率,比如上述的第三种方案,但是他没有第一种方案直观,并且效率也没有说完全高太多,只要在可接受的运行时间和空间内解决问题,那么我们完全可以使用第一种更为简单和直观的方式解决问题。
原文地址:https://www.cnblogs.com/stupidxixi/p/9922031.html