設(shè)計(jì)一個(gè)函數(shù)把兩個(gè)數(shù)字相加。不得使用 + 或者其他算術(shù)運(yùn)算符。
示例:
輸入: a = 1, b = 1
輸出: 2
提示:
a, b 均可能是負(fù)數(shù)或 0
結(jié)果不會溢出 32 位整數(shù)
解題思路
題目中要求不能使用+或者其他運(yùn)算符,所以這題使用位運(yùn)算符來實(shí)現(xiàn)。
普通的整數(shù)相加,如6+5 = 11,因?yàn)槭?0進(jìn)制,所以進(jìn)位1
同理二進(jìn)制也具有這個(gè)規(guī)律,也就是逢二進(jìn)一
在二進(jìn)制位運(yùn)算符中,異或和與運(yùn)算符的規(guī)則如下:
異或^ : 相同則為0,不相同則為1
與& :如果兩個(gè)數(shù)都為1則為1,否則為0
結(jié)合二進(jìn)制逢二進(jìn)一的特性和異或的規(guī)則,我們可以看出兩個(gè)二進(jìn)制進(jìn)行異或的話,會舍去進(jìn)位1,如 0110 ^ 1011 = 1101,第二位向第二位進(jìn)的1被舍去。
被丟棄的進(jìn)位該如何參與到運(yùn)算中?
可以參考運(yùn)算符&,如 0100 & 0101 = 0100,這個(gè)結(jié)果如果向左進(jìn)行帶符號位移的話,恰好能得到進(jìn)位1所在的位置->1000
綜上,結(jié)合上面兩點(diǎn),兩個(gè)整數(shù)a和b相加的話,抽取的數(shù)學(xué)模型如下:
int x = a^b
int y =(a&b)<<1
不斷 x^y , 直到y(tǒng)=0(表示沒有進(jìn)位了)為止。
代碼如下:
class Solution {
public int add(int a, int b) {
while(b != 0)
{
int sum = a ^ b; //不帶進(jìn)位之和
int carry = (a & b) << 1; //進(jìn)位,并且向左進(jìn)一位,如果carry==0,說明沒有進(jìn)位,已經(jīng)得到了結(jié)果,直接退出
a = sum;
b = carry;
}
return a;
}
}