演算法《異或操作交換兩個數的坑》

2021-09-30 14:27:39 字數 1363 閱讀 9328

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個臨時變...