一哥們去筆試,回來后跟我說了一通面試題,其中有一道題讓我很感興趣:
不使用+號實現加法運算
剛聽到后,一臉懵逼,不使用+號怎么算?
問了朋友他也沒做這題,不過仔細想了下,不使用+號,是否可以使用其他運算符?比如位運算符
既然說到這,就看下位運算符有哪些,實現是什么:
&---位與運算符,都為真時才真
|---位或運算符,有一個為真時則真
^---位異或運算符,不同時為真時則真
~---位反運算符,取反
<<---位左移運算符,向左移動N位
>>---位右移運算符,向右移動N位
上面這些是針對二進制來運算,針對加法運算,我們需要知道倆件事情:
1、倆個數對應的二進制位相加應該有如下算法
0+0=0
0+1=1
1+1=0
1+0=1
這個對應異或運算符^
但這里又有個問題,這么向前進一位?這就是第二件事
2、什么數相加需要進一位?
算法如下:
0+0=0
0+1=0
1+1=1
1+0=0
也就是在二進制下,當同時為1時需要進一位
這個可以使用位運算符&,然后在向左移動一位即可實現
這樣1和2分別計算出了位相加和位移的結果,然后這倆個再通過位相加和位運算,直到不能位移了,最后位相加的數才是最后的倆個數相加的值。
具體代碼如下:
def plusNoSignal(x,y): ex_or = x ^ y an_mo = (x & y)<<1 while(an_mo): ex_or_temp = ex_or an_mo_temp = an_mo ex_or = ex_or_temp ^ an_mo_temp an_mo = (ex_or_temp & an_mo_temp)<<1 return ex_or if __name__ = "__main__": input_numbers = input("please input two numbers separate by ',':") x = int(input_numbers.split(',')[0]) y = int(input_numbers.split(',')[1]) print(plusNoSignal(x,y))