題目描述
請編寫一個函數,將兩個數字相加。不得使用+或其他算數運算符。
給定兩個int A和B。請返回A+B的值
測試樣例:
1,2
返回:3
思路
可以通過位運算實現,具體實現如下:
-
二進制位異或運算相當於對應位相加,不考慮進位
比如: 1 ^ 1 = 0 —> 1 + 1 = 0 (當前位值爲0,進一位)
1 ^ 0 = 1 —> 1 + 0 = 1 (當前位值爲1)
0 ^ 0 = 0 —> 0 + 0 = 0 (當前位值爲0) -
二進制位與運算相當於對應位相加之後的進位
比如: 1 & 1 = 1 —> 1 + 1 = 0 (當前位的值進一位)
1 & 0 = 0 —> 1 + 0 = 1 (當前位的值不進位)
0 & 0 = 0 —> 0 + 0 = 0 (當前位的值不進位) -
兩個數相加:對應二進制位相加的結果 + 進位的結果
比如:3 + 2 --> 0011 + 0010 --> 0011 ^ 0010 + ((0011 & 0010) << 1)
—> (0011 ^ 0010) ^ ((0011 & 0010) << 1), 當進位之後的結果爲0時,相加結束
解答代碼
class UnusualAdd {
public:
int addAB(int A, int B) {
int sum = 0, carry = 0;
while (B != 0) {
//對應位的和
sum = A ^ B;
//對應位和的進位,既然是進位,就要整體左移一位
carry = (A & B) << 1;
A = sum;
B = carry;
}
return sum;
}
};
如有不同見解,歡迎留言討論~~