题目:

设计一个函数把两个数相加,不得使用+或者其他算数运算符。

示例:

输入:a=1,b=1
输出:2

提示:

  • a,b均有可能是负数或0
  • 结果不会溢出32位整数

初始思路:

看到题目我就明白只能用位运算,但因为对位运算熟悉度不够,只能想到>>或者<<,能够起到*2,/2的作用,然后选择复制参考了一波题解,着实被惊艳到,所以话不多说,上正菜。

参考思路:

采用半加法的思想,即两个二进制数单独的位相加其结果可以用异或运算得到,进位可以用与运算得到。
解释

例:2+3,相当于10+11(二进制)
1.10^11=01(类似与8+9=7,未加上进位),进位:carry=(10&11<<1=100
2.01^100=101(加上进位),进位:carry=(001&100)<<1=0(进位为0,结束运算)

代码实现:

class Solution {
public:
int add(int a, int b) {
    return b == 0 ? a : add(a ^ b, (unsigned int)(a & b) << 1);
}
};