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

2021-10-13 18:02:49 字數 1569 閱讀 9304

交換數值指的是,兩個數的數值交換,例如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) - (a)), ((b) -= (a)), ((a) = (a) + (b))))

這三個方法的**,一開始會通過&(a) == &(b)檢測a和b是否在記憶體中的同一位置,如果可以保證不會處於同一記憶體位置,可以刪除&(a) == &(b)

計算分3個步驟:

1.	a = a - b;

2. b = b + a;

3. a = b - a;

將1直接帶入2中,可以得到b = b + a - b = a;

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

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

例如:a = 1,b = 2

a = a - b = 1 - 2 = -1

b = b + a = 2 - 1 = 1

a = b - a = 1 - (-1) = 2

完成兩個數的交換。

計算分3個步驟:

1.	a = a + b;

2. b = a - b;

3. a = a - b;

將1直接帶入2中,可以得到b = a + b - b = a;

將1,2帶入3中,可以得到a = a + b - a = b;

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

例如:a = 1,b = 2

a = a + b = 1 + 2 = 3

b = a - b = 3 - 2 = 1

a = a - b = 3 - 1 = 2

完成兩個數的交換。

計算分3個步驟:

1.	a = b - a;

2. b = b - a;

3. a = a + b;

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

將1,2帶入3中,可以得到a = b - a + a = b;

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

例如:a = 1,b = 2

a = b - a = 2 - 1 = 1

b = b - a = 2 - 1 = 1

a = a + b = 1 + 1 = 2

完成兩個數的交換。

bit twiddling hacks by sean eron anderson

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

交換數值指的是,兩個數的數值交換,例如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 進行判...

位操作筆記 位計數演算法 查表法 8位數

演算法 演算法計算過程 拓展 參考資料 位計數 counting bits set 指的是計算乙個數里bit位置1的個數,例如乙個8位數0xea 0b1110 1010,位置1的個數為5。該演算法通過查表的方式來計算乙個數里bit位置1的個數。由於8bit數最多只有256個,也就是最多只有256種情...

位操作筆記 位反轉演算法 通過4次運算完成

這裡的位反轉 bit reversal 指的是乙個數的所有bit位依照中點對換位置,例如0b0101 0111 0b1110 1010。也可以叫二進位制逆序,按位逆序,位翻轉等等。該演算法用於將8bit數進行位反轉。演算法用到了64bit乘法運算。演算法通過4次運算完成位反轉操作。與通過3次運算完成...