使用異或運算交換兩個變數的危險

2021-07-10 16:23:45 字數 1234 閱讀 3555

我們知道,在排序演算法中經常會需要交換序列中的兩個變數,常見有兩種方法:

1.借助第三個臨時變數

// 交換 

int temp = array[i];

array[i] = array[index];

array[index] = temp;

2.借助異或運算的特性

array[i] = array[i] ^ array[index];

array[index] = array[i] ^ array[index];

array[i] = array[i] ^ array[index];

以上兩種方式都實現了array[i]和array[index]的交換,但是第二種方法的使用有乙個前提:i和index不能相等。

當然,理論上來說如果i和index相等的話,那就是同乙個值,有什麼必要交換呢?

確實如此,但是我在寫選擇排序的時候就遇到了這個問題,

大家不妨看看。

package com.sort;

/** * 選擇排序類

* 思路:每次從待排序列中選擇最小的數 放在這個待排序列裡面的第一位(和第一位交換)

* @author maggie

* */

public class selectsort

}// 交換 這種交換是ok的

// int temp = array[i];

// array[i] = array[index];

// array[index] = temp;

// 這種交換必須先判斷index和i不相等,否則會使改變量變為0,

if(index != i)

// 下面這種交換就完全沒有問題,因為j和j+1是不可能相等的,便不會存在那樣的問題

/**// 中間量

array[j] = array[j] ^ array[j+1];

// 交換:此時的array[j+1]其實是原來的array[j]

array[j+1] = array[j] ^ array[j+1];

// 交換:此時的array[j]其實是原來的array[j+1]

array[j] = array[j] ^ array[j+1];

*/} }

}

使用異或運算 不借助臨時變數交換兩個數

通常交換兩個變數需借助乙個臨時變數,如 int temp temp a a b b temp 使用異或可以不借助臨時變數交換兩個數 a a b b a b a a b 這是用了異或的自反性性質做到的 a b b a 0 a 具體推導過程 第一步 a a b 第二步 b a b a b b a 經過第...

異或運算的妙用,兩個整型變數交換位置

異或運算符號 按照二進位制的位進行異或運算 兩個位分別為1 0 不分前後 結果為1,其他都為0 例如十進位制 二進位制 1 12 10 3 11 4 100 5 101 1 2結果二進位制就是11 轉換成十進位制就是3 4 5結果是1 轉換成十進位制還是1 根據上面的我們再來看 1 2 3 3 2 ...

異或運算實現兩個數的交換

通常的交換兩個變數a,b的過程為 int temp temp a a b b temp 需借助上面的第3個臨時變數temp.採用下面的方法,對於給定兩個整數a,b,下面的異或運算可以實現a,b的交換,而無需借助第3個臨時變數 a a b b a b a a b 這個交換兩個變數而無需借助第3個臨時變...