leetcode刷题系列:不用加号实现a+b

Pyhon实现

Write a function that add two numbers A and B.

异或运算:(a^b)

ab结果
000
011
101
110

异或的性质:
(1)交换律:a ^ b ^ c <=> a ^ c ^ b
(2)任何数与0异或 0 ^ n = n
(3)相同的数异或为0 n ^ n => 0

看到异或的结果与加法有相似处。假设两个数(5和6)的二进制码做异或:

十进制二进制
50000 0101
60000 0110
异或0000 0011

对比 5+6=11的二进制码:0000 1011.  我们距离结果还差一个 0000 1000

如果我们把 5和6 的二进制做与 & 运算呢?

十进制二进制
50000 0101
60000 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 相加呢?

十进制二进制
10000 0001
30000 0011
异或0000 0010

异或结果 n1 =0000 0010 ,十进制为 2

十进制二进制
10000 0001
30000 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值