"Coding Interview Guide" -- 不用额外变量交换两个整数的值
【题目】
如何不用任何额外变量交换两个整数的值
【分析】
关于异或运算有三点性质:
1、异或运算满足交换律和结合律;
2、一个数与自己异或的结果为0,即a ^ a = 0;
3、一个数与0异或的结果是它自己本身,即a ^ 0 = a;
4、一个数与1异或的结果是对该数取反,即a ^ 1 = ~a;
1 public static void swapWithoutTemp(int[] a, int[] b) 2 { 3 a[0] = a[0] ^ b[0]; 4 b[0] = a[0] ^ b[0]; // 此时a == a ^ b; b = a ^ b = (a ^ b) ^ b = a ^ (b ^ b) = a; 5 a[0] = a[0] ^ b[0]; // 此时b == a; a = a ^ b = (a ^ b) ^ a = (a ^ a) ^ b = b; 6 }
Java中是值传递,所以无法通过将两个整型值传递给交换函数实现交换它们的值,但是可以将该基本数据类型的值用一个同类型且只包含一个元素的数组包装起来,可达到同样的效果。以本题为例,int[] a = new int[1]; int[] b = new int[1];
来源:左程云老师《程序员代码面试指南》