当前位置:   article > 正文

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

不用+实现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. 可以做退出条件

好巧!那么试试看吧!

  1. def sum(a, b):
  2. tmp = 1
  3. while tmp != 0:
  4. n1 = a^b
  5. n2 = (a&b)<<1
  6. num = n1^n2
  7. tmp = n1&n2
  8. a = n1
  9. b = n2
  10. return num

OK,那么可以试试递归

  1. def add_two(a, b):
  2. if b == 0:
  3. return a
  4. return add_two(a^b,(a&b)<<1)

Over

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/175576?site
推荐阅读
相关标签
  

闽ICP备14008679号