在 C/C++ 面試中,一道高頻考題是:不使用 if-else、三元運算符、比較運算符(>, <, >=, <=),如何求兩個整數中的較大值? 這考察位運算思維與整數在計算機中的存儲表示。
設兩數為 a、b。若 a >= b,則 a - b >= 0,其符號位為 0;若 a < b,則 a - b < 0,符號位為 1(假設 32 位有符號整數,採用補碼表示)。
令 k = (a - b) 的符號位(0 或 1)。則最大值 max = a - k * (a - b)。
當 a >= b 時,k=0,max = a;當 a < b 時,k=1,max = a - (a - b) = b。
(c >> 31) & 0x1。對於負數,算術右移保留符號位(填 1),最低位即為 1;正數填 0,最低位為 0。int Max(int a, int b) {
int c = a - b;
// 取符號位:負數為 1,非負為 0
int k = (c >> 31) & 0x1;
return a - k * c;
}
a ^ ((a ^ b) & -(a < b))(但這用了比較)。純位運算技巧:int diff = a - b; int sign = (diff >> 31) & 1; return a - (sign * diff); 乘法在現代 CPU 極快,通常可接受。網上流傳的 a > b ? a : b 違題意;max(a, b) 庫函數內部仍用比較。本題核心在於將比較轉化為減法溢出/符號位檢測,展現底層數據表示理解。