简单谈谈对整形数值交换几种方式理解:
数值交换是我们经常要用到的知识点,比如在一些经典排序算法中交换两个数的值。
1、设置中间变量。
void swap(int a,int b){ int temp=a; a=b; b=temp; }
分析:此方式是我们经常用的方式,操作简便,速度比较快,多耗费了一点点空间。
2、加法。
void swap(int a,int b){ a=a+b; b=a-b; a=a-b; }
分析:此方法省去了第1种方法中开辟的空间,但是运算比较费时间,而且会有越界的问题->可以讲int转换成long、double等类型。
个人感觉此方法只是一个理论可行方法,平时不会有人这么用的~
3、异或。
void swap(int a,int b){ a^=b; b^=a; a^=b; }
异或操作:^是按位异或运算符。将进行异或的两个数转换成2进制,然后:
①对应位相同的(同为0或1)结果为0 ;
②对应为不同的(有一个为0,另一个为1)结果为1;
分析:异或操作不会出现越界的问题,但是不同类型的值不能进行异或。还有就是经常看到的关于异或交换的漏洞的问题:
①:一个数与其本身异或:a^=a;
②:一个数与数值等于其本身的数异或:a=b=3;a=a^b;b=b^a;a=a^b;
对以上两种情况,以下是我个人的总结以及理解:
a与其本身异或,会导致a=0;
而a异或b,a与b虽然都是指向同一个数值,但是a与b本身的栈内存不相同,所以a^b可以完成数据交换。
总结:对于以上的三种方式,本人建议第一种,容易理解,又不会出错。至于在效率上的问题,在平时接触的比较简单交换中,方法1也是最快的。
后来我又做了一些交换多次的情况,发现还是方法1比较快。
public class test { public static void main(String[] args) { int a=222,b=333; long s = System.currentTimeMillis(); for(int i=0;i<10000000;i++){ swap1(a, b); } long e = System.currentTimeMillis(); System.out.println("a="+a+" b="+b+" 运行时间是:" + (e - s)); } public static void swap1(int a, int b) { a^=b; b^=a; a^=b; } public static void swap2(int a,int b){ int temp=a; a=b; b=temp; } }