位运算数值交换
一般数值交换都是使用一个第三方变量中间者转换,如:
int n = 1;
int m = 2;
int i = n;
n = m;
m = i;
System.out.println("n->"+n);
System.out.println("m->"+m);
运行结果 |
---|
这是普遍的数值交换方式
现在我们使用位运算进行数值交换
int n = 1;
int m = 2;
n = n^m;
m = n^m;
n = n^m;
System.out.println("n->"+n);
System.out.println("m->"+m);
运行结果 |
---|
运行结果一样,进行了数值交换,下面解释一下原理
**^:**异或,相同为0,相异为1
1的二进制为01
2的二进制为10
01^10=11
n=n^m,异或运算后n的二进制为11
注意,n的二进制现在已经为11了,而m的二进制还是10,这时给m赋值为n^m
m = nm,1110,结果为01,而这个结果刚好为1的二进制,这时候m的十进制为1,注意m=1,n还是之前的异或结果11
在给n赋值,n=nm,1101,结果为10,刚好是2的二进制,这时就会发现,数值已经交换完毕。