加法模拟器

Author Avatar
zzz1220 6月 10, 2019
  • 在其它设备中阅读本文章
👉👉本文共573字📘 读完共需2分钟⌚

不用 “+” 怎么实现加法呢?相信大家看到第一时间就会想到用位运算,特别是计算机基础好的同学,立马想到计算机本质不就是2进制做位运算实现计算的吗?

先复习下位运算

与运算&
2&3
2的2进制是10
3的2进制是11
所以就是1011做与运算,只有双方都是true的时候,结果才为true

注意:如果是负数,需要计算补码来做位运算,正数的补码和本身相等。比如-1

源码 1000 0001

反码 1111 1110

补码 1111 1111

与运算 true false
true true false
false false false
或运算 true false
true true true
false true false
异或运算 true false
true false true
false true false

异或和与运算

异或

a = 10   # 1010
b = 5    # 0101
a^b = 15 # 1111

c = 10    #1010
d = 6     #0110
c^b = 12  #1100

a = 10  # 1010
b = 5   # 0101
a&b = 0 # 0000

c = 10   #1010
d = 6    #0110
c&b = 2  #0010

看出点眉目没有?
异或,得到的是两个数没进位的和;而与。得到的是需要进位的位置(这里的位置并不是一一对应,需要向左移动一位,)

算法

def add(a,b):
    res = 0
    while b != 0:
        res = a^b
        b = (a&b)<<1
        a = res
        print(bin(a)[2:],bin(b)[2:])
    return a  

# 计算 10 加 6    
add(10,6)
#output
 1100     100
 1000    1000
    0   10000
10000       0

# 结果
16

原理
a,b先用异或获取不进位的结果,在用与运算获取进位,这个称为进位补偿,然后把这两个结果相加就是a+b了,
但是不然用加法啊,怎么办呢? 可以把前面的流程再走一次,直到进位补偿为0,这时候,上个异或结果就是最终相加的结果了。

根据上面的原理
1.a + b 的问题拆分为 (a 和 b 的无进位结果) + (a 和 b 的进位结果)
2.无进位加法使用异或运算计算得出
3.进位结果使用与运算和移位运算计算得出
4.循环此过程,直到进位为 0

用一个公式就是

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

不过其实还有更简单的方法,毕竟
人生苦短,我选python

def add(self, a, b):
    return sum([a, b])