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

C++ 不用判斷語句求兩數最大值:位運算與數學技巧大揭秘

     編輯:關於C++

方法一:利用絕對值性質

對任意整數 a, b,恒有:
max(a,b) = (a + b + |a - b|) / 2
原理:a + b + |a-b| 等於兩倍的較大值。
代碼:


int a = -10, b = -100;
int c = (a + b + abs(a - b)) / 2; // c = -10

方法二:符號位提取法(無分支)

利用符號位判斷 a - b 的正負:
int diff = a - b;
int sign = (unsigned)diff >> (sizeof(int)*8 - 1); // 0: a>=b, 1: a int max = a - sign * diff; // 或用數組索引

完整示例:


int a = 10, b = 100;
int diff = a - b;
int idx = (unsigned)diff >> 31; // 32位系統
int arr[2] = {a, b};
cout << arr[idx] << endl; // 輸出 100

原理深度解析

  • unsigned 右移保證邏輯移位(高位補 0)。
  • diff >> 31 提取符號位:非負得 0,負得 1(補碼表示)。
  • 數組索引技巧將條件選擇轉化為內存訪問,CPU 分支預測友好。

適用場景與注意事項

  • 嵌入式系統、高性能計算、GPU Shader 等禁用分支場景。
  • 有符號整數溢出屬於未定義行為,建議使用 long long 或無符號類型。
  • 現代編譯器優化極強,std::max 通常已生成無分支指令(CMOV),手寫技巧多用於教學或極端優化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved