Pyhon实现
Write a function that add two numbers A and B.
异或运算:(a^b)
a | b | 结果 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
异或的性质:
(1)交换律:a ^ b ^ c <=> a ^ c ^ b
(2)任何数与0异或 0 ^ n = n
(3)相同的数异或为0 n ^ n => 0
看到异或的结果与加法有相似处。假设两个数(5和6)的二进制码做异或:
十进制 | 二进制 |
5 | 0000 0101 |
6 | 0000 0110 |
异或 | 0000 0011 |
对比 5+6=11的二进制码:0000 1011. 我们距离结果还差一个 0000 1000
如果我们把 5和6 的二进制做与 & 运算呢?
十进制 | 二进制 |
5 | 0000 0101 |
6 | 0000 0110 |
与 | 0000 0100 |
好像只需要再左移一 位就成了0000 1000 即: 0000 0100<<1
然后把得到的异或结果和移位的结果再做异或,就得到了最后结果。
总结一下:
先做异或(^),保留结果 n1
再做(与&运算)接着左移一位(<<1),保留结果 n2
n1和n2 做异或(^),保留结果 num
... ...
按照刚才的例子 5 和 6 来说, n1 = 0000 0011,n2 = 0000 1000
num = 00001011 , 好了 num 就是最终结果,
如果是 1 和 3 相加呢?
十进制 | 二进制 |
1 | 0000 0001 |
3 | 0000 0011 |
异或 | 0000 0010 |
异或结果 n1 =0000 0010 ,十进制为 2
十进制 | 二进制 |
1 | 0000 0001 |
3 | 0000 0011 |
与 | 0000 000 |
与结果为 0000 0001 ,十进制为 1 左移一位 得 n2= 0000 0010, 十进制也为 2
那么num = n1^n2, num = 0
num 此时不是想要的结果. 那么我们把 n1 和 n2 再重复做一遍。
异或:n1^n2 = 2^2 = 0
与和左移:(n1&n2)<<1 = (2&2)<<1 = 2<<1=4
再异或:num =0^4 = 4
这样看来原来可以循环解决!那么如何退出?
要退出了, 做n1和n2的与运算,得到一个 0000 0000. 可以做退出条件
好巧!那么试试看吧!
def sum(a, b):
tmp = 1
while tmp != 0:
n1 = a^b
n2 = (a&b)<<1
num = n1^n2
tmp = n1&n2
a = n1
b = n2
return num
OK,那么可以试试递归
def add_two(a, b):
if b == 0:
return a
return add_two(a^b,(a&b)<<1)
Over