进行异或交换的方法:
public static void exchange(int[] arr,int a, int b) {
arr[a] = arr[a] ^ arr[b];
arr[b] = arr[a] ^ arr[b];
arr[a] = arr[a] ^ arr[b];
}
使用异或交换两个整数:
public static void main(String[] args) {
int[] arr = {1, 2};
exchange(arr,0, 1); //交换a[0]和a[1]的值
System.out.println("1---a[0]="+arr[0]+" a[1]="+arr[1]);
exchange(arr,0, 0); //将a[0]与自己进行交换
System.out.println("2---a[0]="+arr[0]+" a[1]="+arr[1]);
}
输出结果:
1---a[0]=2 a[1]=1
2---a[0]=0 a[1]=1
造成的原因:
如果是数字直接交换或内存地址不一样的交换是没有问题的。但如果交换的是相同的地址,就会有问题。
如上述代码中真正运行的时候:
- arr[a] = arr[a] ^ arr[b];
将同一个地址进行异或,结果为0,也就是arr[a]=0,由于a = 0,则等同于将arr[0]=0,这个步骤之后,arr[b]=arr[0]=0。即将数组对应位置上的数字改为了0