下面首先來看一個問題。
假設存在兩個int型變量a和b,那麼如何實現兩個變量值的交換呢。
通常我們的做法,也是最容易想到的做法就是通過定義一個第三方變量,然後藉助於該變量來實現變量值的交換。
方法一(通常做法):
int temp = a;
a = b;
b = c;
這雖然是最笨的方法,卻是我們工作中使用的最多的方法,因爲它直觀,滿足代碼的易讀性特徵。
那麼,除了以上方法,我們還有沒有其他的解決方法呢?既然都說了上面方法是最笨的方法,肯定還有其他可以解決問題的方法了。下面給出第二種解決方案。
方法二(加減運算法):
a = a + b; //可能會溢出
b = a - b;
a = a - b;
該方法只是通過兩個變量自身的加減運算就能達到我們的目的。但是需要注意的是,兩個數不能太大或者太小,否則如果兩個數都很大或者很小的話,那麼在執行“a = a + b;”語句時可能會發生溢出錯誤,此時得到的結果將不會是我們想要的結果。
那麼在不借助第三方變量情況下是否存在可以在任何變量值的情況下都能夠實現兩個變量的值交換方法呢?
方法是有的,那就是使用異或運算符來解決。異或運算有一個特點就是:一個數據對另一個數據位異或兩次,該數據本身不變,比如輸出語句“System.out.println(5 ^ 10^ 10);”的打印結果爲5。利用這一特性給出解決方案三。
方法三(異或運算)
a = a ^ b; //10 ^ 5
b = a ^ b; //10 ^ 5 ^ 5 y = 10
a = a ^ b; //10 ^ 5 ^ 10 x = 5
直接使用位運算不存在溢出問題,且很好的解決了我們的問題。