交換數值指的是,兩個數的數值交換,例如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次運算完成...