美文网首页
lintcode A+B问题

lintcode A+B问题

作者: yzawyx0220 | 来源:发表于2016-12-07 10:19 被阅读157次

    这道题我们当然可以 return a + b来AC,但是那并不是此题的本意,这道题的意思是让我们不使用加号来实现加法,那么我们使用位运算。

    首先来看十进制,比如我们要计算5 + 9 = 14,不进位的话5 + 9 = 4,5 + 9的进位为1,因此,5 + 9 = 1 * 10 + 4 = 14。同理,放到二进制中也可以使用这种方法。

    异或运算有个别名叫做不进位加法,A ^ B得到的值就是各位上除去后面进上来的进位后它该有的值,那么问题就转化成它的哪些位是有进位的。而只有1 & 1才会等于1,因此我们只需做一次与运算就可以找到有进位的位置,但是进位是要向前进一位的,所以我们再做一次左移运算。

    我们来看个例子:

    a = 3,二进制为0011,b = 6,二进制为0110,(a ^ b)求出不进位和0101(5),(a & b)= 0010(2),我们找到了要进位的位置。因此a + b变成了5 + 2 << 1。

    然后有

    5    0101

    2<<1   0100

    不进位和  0001  = 1

    进位          0100  = 4

    因此 a + b就变成了1 + 4 << 1

    然后有

    1     0001

    4<<1   1000

    不进位和  1001  = 9

    进位          0000  = 0

    当时进位为0时,不进位和为9即a + b之和。

    最后附上C++代码:

    相关文章

      网友评论

          本文标题:lintcode A+B问题

          本文链接:https://www.haomeiwen.com/subject/aykfmttx.html