給出兩個(gè)整數(shù)a和b, 求他們的和, 但不能使用 + 等數(shù)學(xué)運(yùn)算符。
不能用求和運(yùn)算符肯定就是用一些最簡(jiǎn)單的邏輯運(yùn)算符實(shí)現(xiàn)了哩都。
如果沒(méi)有進(jìn)位的情況魁兼,可以了解用異或就可以了(用或也可以爱谁,但是為了和有進(jìn)位的情況統(tǒng)一這里還是用異或)寄啼。
主要考慮進(jìn)位的情況,我們需要把其轉(zhuǎn)換成沒(méi)有進(jìn)位的情況蠢挡∪迓梗考慮這么幾種現(xiàn)象化撕。
- 進(jìn)行位與可以判斷是否需要進(jìn)位。
- 位異或可以處理不需要進(jìn)位的哪些位约炎。
- 需要進(jìn)位的位可以通過(guò)位與獲得植阴。
- 進(jìn)位的位左移一位可以與不需進(jìn)位的位相加可得結(jié)果蟹瘾。
迭代進(jìn)行上述四個(gè)過(guò)程就可以獲得最終的結(jié)果,自然這個(gè)現(xiàn)象怎么可能是我發(fā)現(xiàn)的呢掠手,來(lái)源已不可考憾朴,但是方法還是很好的,code:
int aplusb(int a, int b) {
int c=0,d=0;
while((a&b)!=0) //有進(jìn)位的情況
{
c=a^b; //不考慮進(jìn)位惨撇,亦或就可以
d=(a&b)<<1; //進(jìn)位的情況伊脓,
a=c;
b=d; //這是一個(gè)遞歸,如果移位之后還要進(jìn)位魁衙,再進(jìn)行處理
}
return a|b; //處理完了就是沒(méi)有進(jìn)位了报腔,這樣按位取或就可以了
// write your code here
}
over