lintcode|lintcode A+B问题

这道题我们当然可以 return a + b来AC,但是那并不是此题的本意,这道题的意思是让我们不使用加号来实现加法,那么我们使用位运算。
首先来看十进制,比如我们要计算5 + 9 = 14,不进位的话5 + 9 = 4,5 + 9的进位为1,因此,5 + 9 = 1 * 10 + 4 = 14。同理,放到二进制中也可以使用这种方法。
异或运算有个别名叫做不进位加法,A ^ B得到的值就是各位上除去后面进上来的进位后它该有的值,那么问题就转化成它的哪些位是有进位的。而只有1 & 1才会等于1,因此我们只需做一次与运算就可以找到有进位的位置,但是进位是要向前进一位的,所以我们再做一次左移运算。

【lintcode|lintcode A+B问题】我们来看个例子:
a = 3,二进制为0011,b = 6,二进制为0110,(a ^ b)求出不进位和0101(5),(a & b)= 0010(2),我们找到了要进位的位置。因此a + b变成了5 + 2 << 1。
然后有
50101
2<<10100
不进位和0001= 1
进位0100= 4
因此 a + b就变成了1 + 4 << 1
然后有
10001
4<<11000
不进位和1001= 9
进位0000= 0
当时进位为0时,不进位和为9即a + b之和。
最后附上C++代码:


lintcode|lintcode A+B问题
文章图片

    推荐阅读