不用第三个数据进行数据交换

说到交换数据,大家肯定会想到利用一个第三方数据进行交换:

public class Demo2{
    public static void main(String[]args){
        int a=10;
        int b=5;
        int c;
        c=a;
        a=b;
        b=c;
        System.out.println("利用第三方变量交换");
        System.out.println("a="+a+",b="+b);
    }
}

结果如下:

Compiling Demo2.java……
——Output——
利用第三方变量交换
a=5,b=10
[Finished in 1.0s]
此时我们完成了两个变量的值的交换
但是如果不用第三个变量我们又怎么去交换呢,一般大家会想到这种办法:

public class Demo2{
    public static void main(String[]args){
        int a=10;
        int b=5;
        a=a+b;//做完此步运算,a=15,b=5;
        b=a-b;//做完此步运算,b=10
        a=a-b;//做完此步运算,a=5
        System.out.println("不利用第三方变量交换");
        System.out.println("a="+a+",b="+b);
    }
}

结果如下:

Compiling Demo2.java……
——Output——
不利用第三方变量交换
a=5,b=10
[Finished in 0.6s]

也能完成两个值的交换,但是这两种交换方法都存在着一定的问题,比如两个int类型的变量要交换数据,这两个变量的值相加又超过了int类型的范围时,交换就会出现值的越界问题。

所以我们又有了更好的办法,用’^’进行运算,’^’我们叫做异或运算符,进行异或运算时(不懂异或运算的请自行查询异或运算),一个数对第二个数数异或得到的结果,再对第二个数进行异或,得到的还是原来的数值。代码写出来是这样:
int a=10;
int b=5;
int c;
c=a^b;//此时c为a异或b的结果,现在再用c来异或b,就能得到a本身。根据异或的这个特性我们可以扩展出不用第三方变量的两个变量的值的交换。
交换时可以这样:

public class Demo2{
    public static void main(String[]args){
        int a=10;
        int b=5;
        a=a^b;//此步运算结束后,变量a的值为a异或b后得到的结果
        b=a^b;//用结果再次异或b时,得到的是原来的数值,也就是得到的原来的a值,然后通过等于号把这个结果赋值给了b,此步完成了b得到a的值
        a=a^b;//此步开始执行前,等号右侧的a还是a^b得结果,我们又知道a^b与b^a相等,而且此时b的值为刚开始时a的值,所以现在a^b得到的是b刚开始时的值,然后通过等于号把这个结果复制给了a,此时就完成了不用第三方变量进行两个数的值的交换。
        System.out.println("不利用第三方变量(异或运算)交换");
        System.out.println("a="+a+",b="+b);
    }
}
用异或进行交换两个数的值的特点:

1.异或运算直接对数据的二进制数进行运算,计算机运行效率更高
2.异或运算对二进制数运算时,相同为0,相异为1,得到的二进制数的位数不会变化,不会超出范围
3.弊端,不利于阅读,有的人可能会看不懂。

猜你喜欢

转载自blog.csdn.net/ILYPTING/article/details/70590602