給出兩個(gè)整數(shù)a和b, 求他們的和, 但不能使用 +
等數(shù)學(xué)運(yùn)算符啊央。
a 和 b 都是32位整數(shù)眶诈。可以使用位運(yùn)算符瓜饥。
def aplusb(a, b):
num_list = []
num_list.append(a)
num_list.append(b)
return sum(num_list)
寫一個(gè)函數(shù)册养,求兩個(gè)正整數(shù)之和压固,不得使用 + 等數(shù)學(xué)運(yùn)算符,不得使用 sum() 函數(shù)。
def aplusb(a, b):
sum1 = a ^ b
carry = (a & b) << 1
while carry:
# other_sum = sum1 ^ carry
# carry = (sum1 & carry) << 1
# sum1 = other_sum
sum1, carry = sum1 ^ carry, (sum1 & carry) << 1 #:直接賦值愧膀,不借助中間變量
else :
return sum1
print aplusb(11, 17)
思路和原理:
對(duì)數(shù)字做運(yùn)算谣光,除了四則運(yùn)算之外,也就只剩下位運(yùn)算了蟀悦。位運(yùn)算是針對(duì)二進(jìn)制的氧敢,所以我們用二進(jìn)制和位運(yùn)算嘗試下實(shí)現(xiàn)加法。
加法可分為同位相加和進(jìn)位浙炼。
比如 7+18唯袄,
第一步,同位相加不進(jìn)位资厉。個(gè)位上7+8等于5(不考慮進(jìn)位)蔬顾,十位上0+1等于1,最后結(jié)果是15酪我。
第二步,進(jìn)位且叁。7+8有進(jìn)位,進(jìn)位結(jié)果是10欺矫。
第三部展氓,把前面兩步結(jié)果相加,15+10=25未妹,正好等于7+18的結(jié)果。
那么接下來的問題就是嘗試用二進(jìn)制和位運(yùn)算實(shí)現(xiàn)同位相加和進(jìn)位络它。
二進(jìn)制同位相加(不考慮進(jìn)位):
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0
很明顯可以用位運(yùn)算的按位異或“^”來代替:
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
二進(jìn)制進(jìn)位:
0 + 0 無進(jìn)位
0 + 1 無進(jìn)位
1 + 0 無進(jìn)位
1 + 1 有進(jìn)位
可以用按位與“&”來代替:
0 & 0 無進(jìn)位
0 & 1 無進(jìn)位
1 & 0 無進(jìn)位
1 & 1 有進(jìn)位
而且在位運(yùn)算中化戳,我們有"<<"用來左移位,也就是進(jìn)位扫尖。
基于以上掠廓,我們有了兩個(gè)表達(dá)式:
x^y #同位相加
(x&y)<<1 #進(jìn)位操作
把以上兩步的結(jié)果再用以上的方法相加,如此迭代狰域,當(dāng)“進(jìn)位操作”的結(jié)果為零的時(shí)候黄橘,“同位相加”的結(jié)果就是最終的結(jié)果屈溉。
資料:
位運(yùn)算實(shí)現(xiàn)加法
位操作實(shí)現(xiàn)四則運(yùn)算
20171231