我们知道,用异或运算可以不用定义中间变量就可以交换两个数。如下:
<span style="font-size:14px;">int a=2;
int b=3;
System.out.println("交换前:a="+a+" b="+b);
a=a^b;
b=a^b;
a=a^b;
System.out.println("交换后:a="+a+" b="+b);</span>
输出的结果是:
交换前:a=2 b=3
交换后:a=3 b=2
这样看来,使用异或运算法则交换两个数的方法确实很好用。但是我们在某些特殊的地方使用它就要小心了,比如我们在选择排序算法中使用它时:
<span id="_xhe_cursor"></span><span style="font-size:12px;">package com.test;
public class Test {
public static void main(String[] args) {
int a[] = { 5, 3, 7, 9, 0, 2, 1, 4, 6, 8 };
Select select = new Select();
select.sort(a);
// 遍历输出排好的数组
for (int i : a) {
System.out.print(i + " ");
}
}
}
// 选择排序类
class Select {
public void sort(int a[]) {
for (int j = 0; j < a.length - 1; j++) {
int min = a[j];// 最小的值
int minLndex = j;// 最小值的下标
for (int k = j + 1; k < a.length; k++) {
if (min > a[k]) {
min = a[k];
minLndex = k;
}
}
// 使用异或运算交换两个数
a[j] = a[j] ^ a[minLndex];
a[minLndex] = a[j] ^ a[minLndex];
a[j] = a[j] ^ a[minLndex];
}
}
}</span>
输出的结果是:0 1 2 3 4 5 6 0 8 9
为什么呢?
其实我们知道,异或运算a^a=0,我们仔细分析一下可以发现在选择排序算法中就有a^a的情况,所以出现上面这样的结果也就不奇怪啦。
对于以上bug,我们可以这样解决:
在交换之前先判断
<pre class="java" name="code">if(a[j]!=a[minLndex])
{
a[j]=a[j]^a[minLndex];
a[minLndex]=a[j]^a[minLndex];
a[j]=a[j]^a[minLndex];
}
这样,输出的结果就是正确的了。
总结:以后用到异或运算交换两个数时,首先要想到所有数中有没有自身跟自身交换的情况