简单谈谈对整形数值交换几种方式理解:

数值交换是我们经常要用到的知识点,比如在一些经典排序算法中交换两个数的值。

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;
    }
}

 

posted @ 2016-11-01 13:44  葬瞳飘血  阅读(355)  评论(0编辑  收藏  举报