python使用位運算實現整數加法運算

位運算是二進制的一種基礎運算,在生產中經常用來加密。下面是使用Python位運算來實現加法運算:

主要用到三個位運算符:異或^,和與&、左移位<<。對於異或,同位置數字不同則爲1,相同則爲0:

2^1 = 3  ==> 0010 ^ 0001 = 0011
2^2 = 0  ==> 0010 ^ 0010 = 0000
3^5 = 6  ==> 0011 ^ 0101 = 0110

對於與&,同時爲1則爲1,否則爲0:

8&15 = 8 ==> 1000 & 1111 = 1000
10&5 = 0 ==> 1010 & 0101 = 0000
10&3 = 2 ==> 1010 & 0011 = 0010

左移位,進制的數量級增加:

2<<1 = 4 ==> 0010<<1 = 0100
6<<1 = 12 ==> 0110<<1 = 1100
1<<2 = 4 ==> 0001<<2 = 0100

對於任意數字相加,可以看成其二進制相加並移位的結果,例如:

2+1 = 3 ==> 0010+0001 = 0011
3+5 = 8 ==> 0011+0101 = 1000
1+1 = 2 ==> 0001+0001 = 0010

當位上滿1相加時,則向前進位

所以可以得知,當相加的兩個數二進制的同一個位置上數字不一樣時(1和0或者0和1),這個位置的最終結果肯定是1,如果相同時(0和0或者0和1),這個位置的結果上肯定是0,在不考慮進位的情況時,恰好是個異或運算。

而進位則是如果兩個數都爲1,則進位,否則不進位,恰好是個與運算。則可以表示如下:

a + b = (a^b) + ((a&b)>>1)

可以驗證一下:

12+15==(12^15)+((12&15)<<1) #True
123+321==(123^321)+((123&321)<<1) #True
12+150==(12^150)+((12&150)<<1) #True
199+23==(199^23)+((199&23)<<1) #True

所以可以定義一個函數sum,用Python表示如下:

def sum(a, b):
    return (a^b)+((a&b)<<1)

到這兒基本上就可以解決問題了,我們現在只選要把函數中的“+”號去掉即可,讓sum一直迭代到b爲0,因爲如果b不爲0則說明會有進位的情況存在,所以去掉“+”號進行迭代代碼如下:

def sum(a, b):
    if b is 0:
        return a
    return sum(a^b,(a&b)<<1)

'''
#或者比較pythonic的寫法:
def sum(a, b):
    return a if b is 0 else sum(a^b,(a&b)<<1)
'''

好了,到此sum函數就可以進行加法運算了。

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