1. A + B 问题

题目

给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。

注意事项

你不需要从输入流读入数据,只需要根据aplusb的两个参数a和b,计算他们的和并返回就行。

样例

如果 a=1 并且 b=2,返回3

挑战 

显然你可以直接 return a + b,但是你是否可以挑战一下不这样做?

 

题解

不用加法的加法运算
首先要了解下基本的位运算
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0

1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

而我们加法是
1 + 1 = 0
1 + 0 = 1
0 + 1 = 1
0 + 0 = 0

可以看出和^运算的答案一致,可以知道^可以用作加法运算,而加法还有进位运算
1 + 1 -> 1
1 + 0 -> 0
0 + 1 -> 0
0 + 0 -> 0
和&运算一致,可知&用作进位运算

a + b ->
sum = a ^ b 算出和
step = (a & b) << 1 算出进位, a&b 只算出了需要进位的数值,要左移一下才是真正要加的位置
当step为0的时候,sum就是我们要的答案,如果step不为0,我们需要把sum加上step,只要重复上述步骤,直到step为0,此时sum就是答案。

我用python写的时候遇到一个问题,就是py 的位运算<< 和其他语言的算法不一致,导致答案也出现不一致,负数计算遇到了问题,搞到我以为写法错了,后面百度才直到是python的位移问题
python 的 n << m 是 pow(n*2**m),其他语言应该是真的位运算,所以没问题。最后特殊判断了-n 和 n的情况。

def aplusb(a, b):
    summ = a ^ b
    step = (a & b) << 1
    print (a, b, summ, step)
    while step > 0:
        tSum = summ ^ step
        tStep = (summ & step) << 1
        summ = tSum
        step = tStep
        print summ, step
    return summ

 

 

posted on 2018-03-20 19:11  usp10  阅读(242)  评论(0编辑  收藏  举报

导航