首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

面試經典:不使用判斷與比較運算符求兩數最大值

     編輯:C++ 入門

面試經典:不使用判斷與比較運算符求兩數最大值

在 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。

關鍵技術點

  1. 獲取符號位:(c >> 31) & 0x1。對於負數,算術右移保留符號位(填 1),最低位即為 1;正數填 0,最低位為 0。
  2. 避免溢出:若 a、b 差值可能超出 int 範圍(如 INT_MIN - INT_MAX),需用長整型或無符號型處理。面試中常假設數據範圍安全,或補充說明邊界處理。

標準實現代碼

int Max(int a, int b) {
    int c = a - b;
    // 取符號位:負數為 1,非負為 0
    int k = (c >> 31) & 0x1; 
    return a - k * c;
}

擴展思考

  • 無符號數版本:若 a、b 為 unsigned,無符號減法下溢會變大數,符號位判斷失效。需轉換為有符號長整型計算差值。
  • 不使用乘法:利用位運算 a ^ ((a ^ b) & -(a < b))(但這用了比較)。純位運算技巧:int diff = a - b; int sign = (diff >> 31) & 1; return a - (sign * diff); 乘法在現代 CPU 極快,通常可接受。
  • 浮點數:IEEE 754 表示下,符號位單獨存儲,邏輯類似但需處理 NaN、無窮大等特殊值。

常見誤區澄清

網上流傳的 a > b ? a : b 違題意;max(a, b) 庫函數內部仍用比較。本題核心在於將比較轉化為減法溢出/符號位檢測,展現底層數據表示理解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved