位運算實現int的abs/min/max函數

假定int爲4個字節:ide

int min(int a, int b)it

{class

    int diff = b - a;原理

    // b < a: a + (diff & -1)di

    // b > a: a + (diff &  0)view

    return a + (diff & (diff >> 31));vi

}co

int max(int a, int b)editor

{位運算

    int diff = b - a;

    // b < a: b - (diff & -1)     b小的話 輸出b+diff

    // b > a: b - (diff &  0)     b大輸出 b

    return b - (diff & (diff >> 31));

}

int abs(int a)

{

    int temp = (a >> 31);

    return (a + temp) ^ temp;

}

 

原理上主要有兩點:

1, 整數是以補碼錶示的
2, 有符號數的移位運算是算數移位(乘2和除2)而非物理移位
 

正數和0的補碼同原碼,負數的補碼是絕對值的反碼加1。-1的補碼錶示是0xFFFFFFFF。

 

任何一個非負整數(0~231-1)右移31位都是0;任何一個負整數(-231~-1)右移31位都是-1。這樣min和max就比較容易理解了。

 

再看abs

a ^ -1 == ~a

a ^  0 == a

 

若a非負,沒有任何變化;若a爲負,加-1再取反,獲得絕對值。

相關文章
相關標籤/搜索