这道题我们当然可以 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++代码:
网友评论