根據條件來獲取相反數,比如條件為真時得到相反數,或者條件為假時得到相反數。
該演算法使用了異或來實現,不使用判斷。
當條件為false時,返回相反數。相當於fdontnegate ? v : -v;
int
conditionally_negate_a_value_false
(int val, bool fdontnegate)
當條件為true時,返回相反數。相當於fnegate ? -v : v;
int
conditionally_negate_a_value_true
(int val, bool fnegate)
第一步,fdontnegate - 1。
當fdontnegate 為true時,1 - 1 = 0;
當fdontnegate 為false時,0 - 1 = -1;
第二步,fdontnegate ^ (fdontnegate - 1)。
當fdontnegate 為true時,1 ^ 0 = 0;
當fdontnegate 為false時,0 ^ -1 = -1;
第三步,* val
當fdontnegate 為true時,1 × val = val;
當fdontnegate 為false時,-1 × val = -val;
實現當條件為false時,返回相反數。
計算示例
假設x = 10 ,條件為false
(0 ^ (0 - 1)) * 10
= (0 ^ -1) * 10
= -1 * 10
= -10
得到相反數-10。
假設x = 10 ,條件為true
(1 ^ (1 - 1)) * 10
= (1 ^ 0) * 10
= 1 * 10
= 10
不會得到相反數。
第一步,-fnegate。
當fnegate為true時, 等於-1 ;
當fnegate為false時,等於0;
第二步,val ^ -fnegate。
當fnegate為true時,val ^ -1 = ~val,等於val的值取反;
當fnegate為false時,val ^ 0 = val;
第三步,+ fnegate
當fnegate為true時,~val + 1 = -val,取反加1得到相反數;
當fnegate為false時,val + 0 = val;
計算示例
假設x = 10 ,條件為false
(10 ^ -0) + 0
= (10 ^ 0) + 0
= 10 + 0
= 10
不會得到相反數。
假設x = 10 ,條件為true
(10 ^ -1) + 1
= -11 + 1
= -10
得到相反數-10。
實現當條件為true時,返回相反數。
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次運算完成...