題目來自於lintcode 第1題 a+b問題:
題目如下:
給出兩個整數a和b, 求他們的和, 但不能使用 + 等數**算符。
一般數值進行加法,比如兩個數,a=9,b=7。
當進行十進位制加法的時候,
1. 先算各個位數,
2. 然後得到進製,
3. 最終將進製加上前一位。
由於不用加運算子,只能從位運算進行入手。由於我的自動化專業相關,立刻想到微機原理中的 加法器 。
下圖為半加器:
圖上s為各個位數相加後的結果(不進製),c為進製
半加器的真值表如下:
a b s c
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1
我們把十進位制a=9和a=7分別化為二進位制 a=1001,b=0111。
我們按照十進位制的思路進行運算
1. 先算各個位數(不進製),則1001 + 0111 = 1110
其結果就像是a^b,(a異或b)
2. 然後得到進製。 1001+0111 若進行進製,只有當1 + 1的時候會出現進製,那麼如何得到進製訊號呢? 我們看,1+1 出現進製訊號,1+0,0+0,0+1不會出現進製訊號,其滿足 相與& 的真值表,我們也可以從半加器的內部中直接看出,s=a^b, c=a&b
3. 加上進製。那麼如何加上進製,我們發現1+1的時候(1&1=1)出現進製訊號,但是進製訊號是要進製的,也就是進上前一位,我們用《符號進行移位。
* *即可以把c進一步表示為c=(a&b)<<1;
由於如果前一位位0+1,加上進製符號1,則也會進製,所以要進行不斷的重複上述過程。
演算法**如下:
class solution
};
不用 數字運算子做加法
題目 寫乙個函式,求兩個整數的之和,要求在函式體內不得使用 分析 這又是一道考察發散思維的很有意思的題目。當我們習以為常的東西被限制使用的時候,如何突破常規去思考,就是解決這個問題的關鍵所在。看到的這個題目,我的第一反應是傻眼了,四則運算都不能用,那還能用什麼啊?可是問題總是要解決的,只能開啟思路去...
不用 數字運算子做加法
看到這個的題目第乙個反應就是位運算,但是想不通怎麼進行位運算,看了後面才知道,博主舉了個例子就是5 17 不進製,算出5 17 12,如下圖,就是小學生的運算,下面的1就是進製 這樣最後12 十位的1就是22 同樣,二進位制也可以,5的二進位制是101,17是10001,運算方法 10001 10 ...
CI20 1 不用運算子做加法
實現乙個函式求兩個數的和。不可以用 或其他運算符號。思路 直觀的思路是通過位運算來做加法。第一步 先不考慮進製,將兩個數通過異或可以求得對應位的和 第二步 考慮進製,將兩個數通過與運算可以求得哪些位有進製,然後將該結果左移一位,再和第一步中的結果進行異或,一直迭代制導進製的結果為0。include ...