實現 int add(int a, int b),要求函數體內不使用 + - * / 任何算術運算符。
二進制逐位相加分兩步:
a ^ b(異或,0+0=0, 1+0=1, 1+1=0)。(a & b) << 1(與運算得出進位位,左移一位對齊高位)。因此:a + b = (a ^ b) + ((a & b) << 1)。右側仍含 +,但可構造遞歸:
add(a, b) = add(a ^ b, (a & b) << 1)
終止條件:進位為 0 時,a ^ b 即為最終結果。
int add(int a, int b) {
if (!a) return b; // a 為 0 直接返回 b
return add((a & b) << 1, a ^ b); // 進位、不進位和遞歸
}
int add(int a, int b) {
while (b != 0) {
int carry = (a & b) << 1; // 計算進位
a = a ^ b; // 不進位和
b = carry; // 進位作為下一輪加數
}
return a;
}
| a | b | 預期 | 說明 |
|---|---|---|---|
| 13 | 27 | 40 | 正常正數 |
| -5 | 12 | 7 | 負數參與 |
| INT_MAX | 1 | INT_MIN | 溢出環繞(未定義行為,僅演示邏輯) |
a - b = add(a, add(~b, 1))(二補數)。