我們知道在我們對乙個數進行位運算的時候,是在這個數的補碼上進行的,對於補碼我們知道,正數的補碼是原碼,負數的補碼為原碼除了最高位的符號位,取反,然後加1。把補碼轉換成原碼的時候,正數還是原碼,負數時把補碼除了符號位取反然後加1(我們可以發現如果這時候連符號位也求反,然後加1,與以前不同的只是少了乙個符號位,現在實際上就是這個數的絕對值)。所以我們可以得到對乙個負數求絕對值的表示式為
intsignreversal(
inta)
那麼由這些知識我們可以很快地得到求乙個數的絕對值的表示式:
先移位來取符號位,int i = a >> 31;要注意如果a為正數,i等於0,為負數,i等於-1。然後對i進行判斷——如果i等於0,直接返回。否之,返回~a+1。完整**如下:
[cpp]view plain
copy
//by morewindows( )
intmy_abs(
inta)
現在再分析下。對於任何數,與0異或都會保持不變,與-1即0xffffffff異或就相當於取反。因此,a與i異或後再減i(因為i為0或-1,所以減i即是要麼加0要麼加1)也可以得到絕對值。所以可以對上面**優化下:
[cpp]view plain
copy
//by morewindows( )
intmy_abs(
inta)
而且有些筆面試題就要求這樣做(比如不讓用if語句的時候),因此建議讀者記住該方法
用位運算實現求絕對值
一般情況下,如果要我們寫乙個求絕對值的函式,我們的實現很有可能會是這樣 templatet abs normal t tnum 也就是說我們會用到乙個if else判斷來決定是否反轉符號位。在3d遊戲軟體,或一些對效能要求比較高的底層系統中,當大規模的求絕對值時,這個if else結構會帶來效能上的...
用位運算實現求絕對值 有效避開if else判斷
一般情況下,如果要我們寫乙個求絕對值的函式,我們的實現很有可能會是這樣 template class t t abs normal t tnum 也就是說我們會用到乙個if else判斷來決定是否反轉符號位。在3d遊戲軟體,或一些對效能要求比較高的底層系統中,當大規模的求絕對值時,這個if else...
位運算 求乙個 數二進位制中1的個數
1 與 有0則0 無0則1 2 或 有1則1,無1則0 3 亦或 相同為0,不同為1 4 右移 最右邊的位被拋棄 正數,最左邊添0 00001010 3 00000001 負數,最左邊添1 10001010 3 11110001 5 左移 最左邊的位被拋棄 最右邊統一添0 正數 00001010 3...