java不使用第三變量交換兩個變量的值
不使用第三變量交換兩個變量的值
在 Java 中,經(jīng)常會需要交換兩個變量的值,我們一般是使用第三變量完成
比如:
temp = a; a = b; b = temp;
這樣的寫法確實能達成目標(biāo),但因此而引入了第三變量,對資源的消耗增加了。
這里總結(jié)了兩種不使用第三變量實現(xiàn)的方式
這兩種方法僅為個人總結(jié),不能斷定只有這三種,非常希望大家能提出其他的方式,互相學(xué)習(xí)。
加減交換法
a = a + b; b = a - b; a = a - b;a = a + b; b = a - b; a = a - b;
這種方式還有更高級的寫法:
a = a + b - (b = a);
這種寫法確實達到了目標(biāo),但還只是數(shù)字層面的技巧,下面介紹一種計算機底層的方式。
異或運算法
異或運算平時用得較少,這里先介紹一下。
兩個數(shù)進行異或運算,其實就是它們的二進制數(shù)每一位進行運算:相同為 0,不同為 1。
0 ^ 0 = 0;1 ^ 0 = 1;0 ^ 1 = 1;1 ^ 1 = 0;
由此可以得出異或的 3 個特點:
- 0 異或任何數(shù) = 任何數(shù)
- 1異或任何數(shù) = 任何數(shù)取反
- 任何數(shù)異或自己 = 把自己置0
異或的常見用途:
- 使某些特定的位翻轉(zhuǎn)
例如對數(shù) 10100001 的第 2 位和第 3 位翻轉(zhuǎn),則可以將該數(shù)與 00000110 進行異或運算:
10100001 ^ 00000110 = 10100111
- 兩個變量值的交換,而不必使用第三變量
這就是我們這里的需求了。
例如交換兩個整數(shù) a = 10100001,b = 00000110 的值, 可以這樣實現(xiàn):
a = a ^ b; // a = 10100111 b = b ^ a; // b = 10100001 a = a ^ b; // a = 00000110
以上過程等效于:
a = a ^ b; b = b ^ a = b ^ ( a ^ b ) = a ^ b ^ b = a ^ 0 = a; a = a ^ b = (a ^ b) ^ a = b ^ a ^ a = b ^ 0 = b;
這樣就實現(xiàn)了兩個變量值的交換。
更推薦這種方式,倒不因為這樣寫更高級,而是這樣的二進制運算是最快的,執(zhí)行效率最高。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java獲取http和https協(xié)議返回的json數(shù)據(jù)
本篇文章主要介紹了Java獲取http和https協(xié)議返回的json數(shù)據(jù) ,本篇文章提供兩個方法,幫助各位如何獲取http和https返回的數(shù)據(jù)。有興趣的可以了解一下。2017-01-01RecyclerChart動態(tài)屬性圖標(biāo)聯(lián)動數(shù)據(jù)動態(tài)加載詳解
這篇文章主要為大家介紹了RecyclerChart動態(tài)屬性圖標(biāo)聯(lián)動數(shù)據(jù)動態(tài)加載詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03spring異步service中處理線程數(shù)限制詳解
這篇文章主要給大家介紹了關(guān)于spring異步service中處理線程數(shù)限制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09