if、while、switch、for、?:。>、<、== 等)。#includeint max_val(int a, int b) { int diff = a - b; // 正→a大,負→b大 int sign = (unsigned)diff >> 31; // 算術右移:負得全1(0xFFFFFFFF),非負得0 int arr[2] = { b, a }; // 索引 0→b, 1→a return arr[sign & 1]; // sign=0 取 a, sign=-1(即1) 取 b } int main(void) { int a, b; scanf("%d %d", &a, &b); printf("%d\n", max_val(a, b)); return 0; }
| a-b | sign (unsigned>>31) | sign & 1 | arr[index] | 結果 |
|---|---|---|---|---|
| >=0 | 0 | 0 | arr[0]=b | b (錯誤!) |
| <0 | 0xFFFFFFFF (-1) | 1 | arr[1]=a | a (錯誤!) |
修正:sign = ((unsigned)(b - a)) >> 31; 使 a>b 時 sign=0 取 arr[1]。
或交換陣列順序 int arr[2] = {a, b}; 配合原邏輯。
int max_val(int a, int b) {
int diff = b - a; // b-a 正→b大
int sign = (unsigned)diff >> 31; // b>a 時 sign=0
int arr[2] = { a, b }; // 0→a, 1→b
return arr[sign & 1]; // b>a 取 b
}
輸入:3 5 → 輸出 5 輸入:10 2 → 輸出 10 輸入:-5 -3 → 輸出 -3
int abs_val(int x) {
int mask = x >> 31; // 負數全1,非負全0
return (x ^ mask) - mask; // (x^mask) 翻轉負數位元,-mask 相當於 +1
}