LintCode A + B 問題 : 理解不使用運算符計算加乘

給出兩個整數a和b, 求他們的和, 但不能使用 + 等數學運算符。

這是來自http://www.lintcode.com/zh-cn/problem/a-b-problem/的問題

很容易就聯想到位運算,但是不能用加減乘除,只用位運算的方法怎麼實現呢?

首先我們要了解下位運算符:

>
“&”:按位與
“|” :按位或
“^” : 異或
“>>” : 右移運算符 , 相當於num除以2
“<<” : 左移運算符,num << 1,相當於num乘以2
“>>>” : 無符號右移,忽略符號位,空位都以0補齊

那麼用位運算我們怎麼實現A+B呢?首先我們先觀察一下正常的二進制數字相加

a : 0101 b:1011
a+b = ?
a : 0101
b : 1011
首先用a&b得到需要進位的數字 :a&b = 0001
很明顯這a&b是需要進一位的
然後我們用a^b得到不需要進位的數字:a^b = 1110
於是我們繼續用需要進位的數字(c)與不需要進位的數字(d)進行之前的操作
1.c&d = 0(無位需進=>值爲0)
2.c^d = 1111(得出結果)

觀察上面計算0101和1011的過程就可以看出來我們的僞代碼應該是

count(int a,int b)
    while a != 0
        int ta = a;
        int tb = b; 
        a = ta&tb
        b = ta^tb
    loop
    return b

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章