利用正負號位元(Sign Bit)區分數值大小關係,透過函式指標表跳轉至對應比較邏輯,完全避開 if/else、?:、比較運算子。
int bits = sizeof(int) * 8 - 1; int sign = x >> bits;(算術右移保留符號位,正數為 0,負數為 -1)。abs(sign) 將 -1 轉為 1,正數仍為 0。Flag = s1 * 2 + s2,產生 0~3 四種情況:
z = x - y; s = z >> (bits+32); return t[abs(s)];(利用溢位特性與高位擴展判斷差值符號)。return t[Flag - 1];。#include <iostream>
#include <cmath>
#define BITS (sizeof(int) * 8 - 1)
static int CheckFlag(int x, int y) {
int s1 = abs(x >> BITS);
int s2 = abs(y >> BITS);
return s1 * 2 + s2;
}
static int SameSign(int Flag, int x, int y) {
int t[2] = {x, y};
long z = (long)x - y; // 使用 long 避免溢位未定義行為
int s = abs(z >> (BITS + 32)); // 取得差值符號位
return t[s];
}
static int DiffSign(int Flag, int x, int y) {
int t[2] = {x, y};
return t[Flag - 1]; // Flag=1 回傳 y(正數), Flag=2 回傳 x(正數)
}
static int (*FuncList[4])(int, int, int) = {SameSign, DiffSign, DiffSign, SameSign};
static int Max(int x, int y) {
int Flag = CheckFlag(x, y);
return (*FuncList[Flag])(Flag, x, y);
}
int main() {
int x, y, z;
std::cout << "請輸入 x (-32768~32767): "; std::cin >> x;
std::cout << "請輸入 y (-32768~32767): "; std::cin >> y;
z = Max(x, y);
std::cout << "最大值: " << z << std::endl;
return 0;
}
long 寬度假設、abs(INT_MIN) 未定義行為、可讀性極差。std::max(x, y) 或 (x > y) ? x : y,編譯器會優化為條件移動指令(CMOV),無分支預測罰則。