假定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再取反,獲得絕對值。