1. 為什麼要獲得符號位
很多時候,我們需要判斷數值的正負,來做相應的邏輯處理。條件判斷語句可以很好的完成這個需求。有時候會有下面的情況,
if (x > 0) { x = x - 1; } else { x = 1 - x; } if (x < 0) { x = -x; }
2. 如何得到符號位
可能有很多種方法。但是通過移位來獲得符號位是最直接想到的。移位有左移右移, 右移因為有符號位的問題。所以,有2個情況,有符號右移和無符號右移。有符號右移空位補符號位,無符號右移空位補0。當把有符號數,符號位移動到右邊第一位的時候,結果-1就是負數,0就是正數。當把無符號數,符號位移動到右邊第一位時候,結果1是負數,0正數。
3. 一種實現方法
因為浮點數無法移位,所以要麼強轉成整數處理,要麼就要拆成數組處理。這裡我們使用當做數組處理。
首先,我們把數值無論什麼類型當做char[]數組來處理,
(signed char*) &x
((signed char*) &x)[sizeof(x) - 1]
((signed char*) &x)[sizeof(x) - 1] >> 7
右移7位表示把符號移動到右邊第一位,那麼,正數就是0,負數就是-1
最後,完整的宏定義
/** * Get x sign bit only for little-endian * if x >= 0 then 1 * if x < 0 then -1 */ #define MathUtils_SignBit(x) \ (((signed char*) &x)[sizeof(x) - 1] >> 7 | 1)
結果與1或,是把[0, -1]映射到[1, -1], 這樣我們就可以把最開始的例子寫成這樣:
x = (x - 1) * MathUtils_SignBit(x) x *= MathUtils_SignBit(x)