题目:
设计一个函数把两个数相加,不得使用+或者其他算数运算符。
示例:
输入: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);
}
};