数组中用异或实现两数交换结果为0
public static void swap(int[] arr, int i, int j) {
//申请一个临时变量,无问题
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
用异或实现
public static void swap(int[] arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
看似完美无瑕,实则暗藏玄机!!!
//如果交换的两数下标相等,如i=j=2
arr[i] = arr[i] ^ arr[j]; //arr[2] = arr[2]^arr[2]=0,所以arr[2]=0!!!
arr[j] = arr[i] ^ arr[j]; //arr[2] = arr[2]^arr[2] = 0^0 = 0
arr[i] = arr[i] ^ arr[j]; //arr[2] = arr[2]^arr[2] = 0^0 = 0
//所以结果为arr[i]=arr[j]=0!!!, 中招了吗
添加判断条件
public static void swap(int[] arr, int i, int j) {
if (i == j) {
return;
}
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
另,数组是否可不做参数?
public static void swap(int a, int b){
a = a^b;
b = a^b;
a = a^b;
}
int[] arr = {1,2};
swap(arr[0], arr[1]);
System.out.println(arr[0]+" "+arr[1]);
运行结果是不可以哦,因为数组不做参数的话,相当于两个形参进行交换,方法运行结束,形参就失效了,结果不会返回。所以需要把数组作为方法的参数。