天天看點

不用加減乘除号完成兩個整數的加法。

描述:

寫一個函數,求兩個整數之和,要求在函數體内不得使用+、-、*、/四則運算符号。

兩個整數為num1、num2。

分析:

在計組中學過的知識:

半加器、全加器中:

兩個二進制的相加結果是用一個異或門實作的;

兩個二進制的進位結果是用一個與門來實作的。

 也就是說:

在不考慮進位的情況下,兩個數二進制加法可以直接用異或門來實作,假設得出的無進位加法結果為answer。

現在隻需要再把進位的情況考慮進去:進位的結果可以用與門來計算得出,假設為p,并且因為是進位,是以還需要左移一位。

是以可以得出如下公式:

answer=num1^num2;

p=(num1&num2)<<1;

我們目前得到的answer是不一定正确的,因為進位沒有考慮,當p=0,沒有進位的時候,answer就是答案。

是以下一步需要把answer和p當做新的num1和num2來繼續做如上操作,直至p為0。

class Solution {
public:
    int Add(int num1, int num2)
    {
        int answer=num1^num2;
        int p=(num1&num2)<<1;
        while (p!=0){
            num1=answer;
            num2=p;
            answer=num1^num2;
            p=(num1&num2)<<1;
        }
        return answer;
    }
};
           

思考:p為什麼一定會變成0呢?

因為p的變化過程就是進位過程,不可能存在一直進位的情況。

例如111+111,p的初始值是1110,表示在2 3 4位分别産生進位,在下一次的異或中,進位全部成功,p就變成了0.

p的變化應該是沒有規律可循的,與實際的num1和num2有關,并不是某個位進一次位,p變化一次,而是p變化一次,整體進位一次,可能多個位同時進位了。

繼續閱讀