位操作筆記 根據條件來獲取相反數 不使用分支判斷

2021-10-17 21:09:09 字數 1685 閱讀 1731

根據條件來獲取相反數,比如條件為真時得到相反數,或者條件為假時得到相反數。

該演算法使用了異或來實現,不使用判斷。

當條件為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次運算完成...