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

不使用比較運算符與循環判斷兩數大小:位運算技巧實現 max 函式

     編輯:關於C語言

題目限制

不使用 if、?、>、< 等比較/分支語句,僅用位運算實現 max(a, b)。

核心思路:符號位提取

  1. 計算差值 diff = a - b。
  2. 若 a >= b,diff >= 0,符號位 (MSB) 為 0;若 a < b,diff < 0,符號位為 1(補碼表示)。
  3. 提取符號位:sign = (diff & 0x80000000) >> 31(32 位 int)。結果為 0 或 1。
  4. 構造陣列 int arr[2] = {a, b},返回 arr[sign]。

代碼實現

int max(int a, int b) {
    int arr[2] = {a, b};
    // 取差值符號位:非負為 0,負為 1
    int sign = ((a - b) & 0x80000000) >> 31;
    return arr[sign];
}

原理驗證

aba-b符號位signarr[sign]結果
1055 (正)00arr[0]=a10 ✓
510-5 (負)11arr[1]=b10 ✓
-2-53 (正)00arr[0]=a-2 ✓

注意事項與擴展

  • 溢出風險:a - b 可能溢出(如 INT_MAX - INT_MIN)。工程上應用無符號數轉換或編譯器內建函式(__builtin_clz 等)規避。
  • 無分支優化:現代編譯器對 a > b ? a : b 會自動生成條件移動指令 (CMOV),無需手寫位運算技巧。
  • 泛化:同理可實現 min、abs、sign 等無分支運算。

總結

利用補碼符號位特性,配合陣列索引選擇,巧妙繞過比較分支。此類位運算技巧屬於「黑客技藝」,理解其原理有助於閱讀底層庫代碼,但生產環境優先可讀性與編譯器優化。

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