private
static
void
swaptwonum(int a, int i, int j)
很多人都習慣使用了異或操作:
public
class test1 ;
swaptwonum(nums, 0, 0);
}//自身和自身交換
private
static
void
swaptwonum(int a, int i, int j)
}
看一下輸出結果:
和你想象的不一樣吧,我要說的重點就是在這裡了
下面老剖析一下為什麼會出現這種結果:
首先,
a[i] = a[i] ^ a[j];//第一步
a[j] = a[i] ^ a[j];//第二步
a[i] = a[i] ^ a[j];//第三步
我們傳遞進去的i=j,導致最終a[i]和a[j]都指向了同一塊記憶體,那麼經過第一步的異或操作之後,這塊記憶體指標已經變成0了(至於為什麼,我並不打算贅述,任何乙個數與自身進行異或操作都是0)
a[i]=a[j]=0
第二步驟的時候,a[j]=0^0=0;
第三步驟的時候,a[i]=0^0=0.
所以就可以解釋了為什麼我們得到了上面的結果。
總結起來最根本的原因就是,我們在對同一塊記憶體位址操作
在使用的時候需要格外注意這一點,只要不是只想同一塊記憶體位址的兩個引用使用異或都會交換成功,即使是值相等但是記憶體位址不同的兩個值,比如:
}//自身和自身交換
這種辦法也要注意的是加法可能會造成溢位
加減法還會出現類似異或操作的結果,使用的時候也要格外注意:
異或交換兩個數
void swap int a,int b 一般我們可以用異或來進行交換兩個數,以前我也不知道會有這個問題,最近在準備考研寫排序的時候,發現自己寫的swap函式在選擇排序的時候會出現個別0。通過查閱大佬們的部落格,發現問題是由於swap在對同乙個物件進行異或的時候,因為同乙個物件的位址是相同的,所以...
C C 異或操作巧妙實現兩個數的交換操作
今天在看opengl載入tga格式影象用作紋理的 時,看到關於rgb a 順序轉換的一行 時,捉一開始感到很困惑,後來想了想,就是實現交換操作。原始 texture imagedata cswap texture imagedata cswap 2 texture imagedata cswap t...
異或運算實現兩個數的交換
通常的交換兩個變數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個臨時變...