[每日一題]56:另類加法

題目描述

請編寫一個函數,將兩個數字相加。不得使用+或其他算數運算符。
給定兩個int A和B。請返回A+B的值

測試樣例:

1,2
返回:3

思路

可以通過位運算實現,具體實現如下:

  1. 二進制位異或運算相當於對應位相加,不考慮進位
    比如: 1 ^ 1 = 0 —> 1 + 1 = 0 (當前位值爲0,進一位)
    1 ^ 0 = 1 —> 1 + 0 = 1 (當前位值爲1)
    0 ^ 0 = 0 —> 0 + 0 = 0 (當前位值爲0)

  2. 二進制位與運算相當於對應位相加之後的進位
    比如: 1 & 1 = 1 —> 1 + 1 = 0 (當前位的值進一位)
    1 & 0 = 0 —> 1 + 0 = 1 (當前位的值不進位)
    0 & 0 = 0 —> 0 + 0 = 0 (當前位的值不進位)

  3. 兩個數相加:對應二進制位相加的結果 + 進位的結果
    比如: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;
	}
};

如有不同見解,歡迎留言討論~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章