加法模拟器
👉👉本文共573字📘
读完共需2分钟⌚
不用 “+” 怎么实现加法呢?相信大家看到第一时间就会想到用位运算,特别是计算机基础好的同学,立马想到计算机本质不就是2进制做位运算实现计算的吗?
¶先复习下位运算
与运算&
2&3
2的2进制是10
3的2进制是11
所以就是10和11做与运算,只有双方都是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])