題目:實現int add(int a, int b)方法,實現a和b的和,但是內部不允許使用+-*/等算術運算。
解答:這個題考查的其實是對計算機硬件如何做加法的。計算機內做加法和乘法都是模擬人做加法和乘法的方法來設計和實現cpu算術運算模塊的。這在我們學習計算機組成原理的課程時應該學到過。如下面例子:
1101
11
+
--------------
10000
這個計算可以分為兩部分,一部分是按位+的過程,另一部分是進位的過程。按位+,其實就是異或運算了,1+1=0,進1位,0+1=1+0=1,0+0=0那進位如何計算呢?在什麼情況下進位,1+1的時候才進位,你應該馬上能想到與運算。進的那一位加到高位繼續參加下一步的運算。那麼我們可以得到如下公式:
a+b=a^b+(a&b)<<1
那這裡還用到了加法,沒法解決我們的問題,但是你不覺得這是一個遞歸嗎?
add(a,b)=add(a^b,(a&b)<<1)
那這個遞歸什麼時候終止呢?顯然,a或b中有一個是0,肯定就可以終止了。
下面是代碼:
int add(int a, int b) { if (!a) return b; else return add((a & b) << 1, a ^ b); }
本文出自 “驿落黃昏” 博客,請務必保留此出處http://yiluohuanghun.blog.51cto.com/3407300/1294327