描述:
寫一個函數,求兩個整數之和,要求在函數體内不得使用+、-、*、/四則運算符号。
兩個整數為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變化一次,整體進位一次,可能多個位同時進位了。