在面試筆試中會考到這類題目,要求不用加減乘除運算來計算兩數和,其實考的就是位運算。 javascript
規則1: java
若是1010+0101 = 1111在計算上不產生進位, 則1010^0101 = 1010+0101 = 1111 面試
上面1010和 0101 二進制加法計算的特色是沒有進位,因此他們的二進制加法和按位異或運算結果纔會相同。可是若是若是是二進制加法運算有進位,則明顯以上等價關係就不能成立。 app
思路:如 20(10100)+25(11001) =45二進制加法運算會產生進位,那咱們把他轉換成a和b兩個數 知足a+b = 20+25 = 45且a和b二進制加法不會產生進位,按照規則1有 20+25 = a + b = a ^ b,明顯咱們能夠找到一個例子 a=32(100000) b=13(001101)知足上述要求。 spa
如何找到a 和 b: 遞歸
當產生進位的時候,咱們能夠試着把產生進制的位置找出來, 20(10100)+25(11001) 進行按位與運算
ip
10100&11001 = 10000 可知道在最高位是兩個1相與,故在最高位產生進位,10100^11001 = 01101這個結果是不進位的結果,只要咱們把不進位的異或運算加上進位時候帶來的結果增量加起來,就是咱們最終想要的結果10100+11001 = 101101 . flash
結果爲:10100^11001+(10100&11001)<<1 = 01101+10000 <<1 it
a = 01101 io
b = 10000 <<1
若是a b還不知足上面思路中的人要求的話,在繼續重複上面的過程,知道找出知足思路中的啊a,b的值。
代碼以下:
結果: