每日一練(34):不用加減乘除做加法

加班猿發表於2022-03-15

title: 每日一練(34):不用加減乘除做加法

categories:[劍指offer]

tags:[每日一練]

date: 2022/03/09


每日一練(34):不用加減乘除做加法

寫一個函式,求兩個整數之和,要求在函式體內不得使用 “+”、“-”、“*”、“/” 四則運算子號。

示例:

輸入: a = 1, b = 1

輸出: 2

提示:

a, b 均可能是負數或 0

結果不會溢位 32 位整數

來源:力扣(LeetCode)

連結:https://leetcode-cn.com/probl...

方法一:位運算

演算法流程:

a ^ b 計算出2個加數二進位制下每一位的本位

a & b 計算出2個加數二進位制下每一位的進位

(a & b) << 1 進位做進位邏輯,也就是 * 2

int add(int a, int b) {
    while (b != 0) {
        int carry = a & b ;     // 計算 進位
        a ^= b;                // 計算 本位
        b = (unsigned)c << 1;    
    }
    return a;
}

方法二:遞迴

加法=進位+非進位部分

利用異或位運算來表示不進位的情況 00=0 11=0 10=1 01=1

利用與運算和左移運算來表示進位的情況 11=10

在迴圈中也要進行左移操作

int add(int a, int b) {
    // 後續用a表示非進位和,b表示進位,當進位為0,則表示計算結束
    return b ? add(a ^ b, (unsigned)(a & b) << 1) : a;
}

相關文章