疑问:交换两个数的若干问题

来源:互联网 发布:dbc数据库保存 编辑:程序博客网 时间:2024/06/03 18:36

涉及交换两个数的问题中,有三种解决方法:

A:利用第三变量temp

B:利用加减法,

A=A+B;

B=A-B;

A=A-B;

C:第三种是利用位^(异或运算符)运算,如

public static void main(String[] args) {
int a = 2;
int b = 4;

a = a ^ b;
b = a ^ b;
a = a ^ b;

System.out.println(a);
System.out.println(b);
}

第三种方法不明白为什么,所以我调试了下程序,


我们可以看到,经过了a=a^b;这步,a已经发生了变化,

a:0000 0000 0000 0010

^

b:0000 0000 0000 0100

=

a:0000 0000 0000 0110


所以结果就是6,再接下来

可以看到,b也发生了变化

a:0000 0000 0000 0110

^

b:0000 0000 0000 0100

=

b:0000 0000 0000 0010

上面的结果其实可以发现一些细节,其实是巧妙借用了异或运算进行变换,

那么问题来了,怎么个巧妙法?

第一步,它先用异或运算把两个值的不同点都拿出来,

第二步,再用异或运算把第一步的结果减去b,得出的就是a了吧,(即是b=a)


那么,这时就可以推断出第三步了,

第三步,第一步结果减去b(原来的a值),那么就是b.

a也再次发生变化

a:0000 0000 0000 0110

^

b:0000 0000 0000 0010

=

b:0000 0000 0000 0100


总结:从上面可以看出,其实就是相当于第二种方法了,

先把两个数加起来,然后减去第一个数,再减去第二个数。


为了验证我的总结,直接调试了下结果,


结果正确~


故此,两数交换的原理也掌握清楚。


0 0