今天在看王老师的Java项目题时,发现有个答案在进行二分法排序的时候,在交换变量这块,并没声明申请中间变量,而是直接进行异或交换,由于第一次遇到这样的情况,感觉非常新鲜,好奇之下探究了下,首先看看它的具体方法是什么样子的:
- public static void sort(int[] a) {
- for (int i = 0; i < a.length - 1; i++) {
- boolean noswap = true;
- for (int j = 0; j < a.length-i-1; j++) {
- if (a[j] > a[j+1]) {
- //int temp = 0;
- /*temp = a[j];
- a[j] = a[j + 1];
- a[j + 1] = temp;*/
- a[j]^=a[j+1];
- a[j+1]^=a[j];
- a[j]^=a[j+1];//异或交换
- noswap = false;
- }
- }
- if (noswap)
- break;
- }
- }
这里其实就是用到了异或计算方法,相同为0,不同为1,且若c=a^b,则a^c == b, b^c == a,不过在网上看了某人的评价,说这样做在时间性能上不好,建议不要用,只为应对面试题而已……
分析:
前两个赋值语句:“a = a ^ b;”和“b = b ^ a;”相当于b = b ^ (a ^ b),而b ^ a ^ b等于a ^ b ^ b。b ^ b的结果为0,因为同一个数与相向相^,结果必为0。因此b的值等于a ^ 0,即a。
再执行第三个赋值语句:“a = a ^ b”。由于a的值等于(a ^ b),b的值等于(b ^ a ^ b),因此,相当于a = a ^ b ^ b ^ a ^ b,即a的值等于a ^ a ^ b ^ b ^ b,等于b。