位操作筆記 交換數值 使用異或

2021-10-13 18:31:35 字數 1390 閱讀 5121

交換數值指的是,兩個數的數值交換,例如x = 1,y = 2,交換之後變成x = 2,y = 1。

通過異或來實現交換數值。

#define swap(a, b) (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b)))
上述方法,如果a和b在記憶體中的同一位置,會不起作用,導致數值變為0。

如果可能出現a和b在記憶體中的同一位置,那麼可以加入(a) == (b)進行判斷。

#define swap(a, b) (((a) == (b)) || (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))))
或者是加入&(a) == &(b)進行判斷。

#define swap(a, b) ((&(a) == &(b)) || (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))))
或者是加入(a) ^ (b)進行判斷,兩個相同的數異或結果為0。

#define swap(a, b) (((a) ^ (b)) && (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))))
另外還有一種變種寫法如下,在有些機器上可能這條語句會更快一點。

#define swap(a, b) (((a) ^ (b)) && ((b) ^= (a) ^= (b), (a) ^= (b)))
計算分3個步驟:

1.	a ^= b;

2. b ^= a;

3. a ^= b;

異或運算支援運算的交換律與結合律,

任意數與0進行異或都等於其本身,x ^ 0 = x。

將1直接帶入2中,可以得到b = b ^ (a ^ b) = b ^ a ^ b = a ^ (b ^ b) = a ^ 0 = a ;

將1,2帶入3中,可以得到a = a ^ b = (a ^ b) ^ a = a ^ b ^ a = b ^ (a ^ a) = b;

完成a,b兩個數值交換。

例如:a = 5 = 0b0101,b = 2 = 0b0010

a = a ^ b = 5 ^ 2 = 0b0101 ^ 0b0010 = 0b0111 = 7

b = b ^ a = 2 ^ 7 = 0b0010 ^ 0b0111 = 0b0101 = 5

a = a ^ b = 7 ^ 5 = 0b0111 ^ 0b0101 = 0b0010 = 2

完成兩個數的交換。

bit twiddling hacks by sean eron anderson

位操作筆記 交換數值 使用加減法

交換數值指的是,兩個數的數值交換,例如x 1,y 2,交換之後變成x 2,y 1。通過加法和減法來實現交換數值。define swap a,b a b a b b a a b a define swap2 a,b a b a b b a b a b define swap3 a,b a b a b ...

通過異或交換變數的數值

通過異或交換變數的數值,最我最為推薦的swap方法,相比 借用第三變數,temp a a b b temp 異或交換 更有效率!利用加減法,a a b b a b a a b 異或交換 適用範圍更廣。這裡的適用範圍更廣,說得有點牽強。加減法給我的直觀感覺是 不安全,當 a a b 的結果超出了該變數...

位操作應用 異或

0abcdef題意 購買了n對襪子,每對襪子都有自己的名字 即7個字元 丟失了乙隻,找出丟失的襪子的名字。首先想到的是對二維字元陣列排序,這樣很費空間。還有一種做法就是用異或操作。用兩個字串a和b分別記錄前一次的結果和新輸入的字串,對同下標的字元進行異或操作,最後結果就是a。異或運算滿足交換律 b ...