题目描述
(简单)写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1
输出: 2
解题思路
这真的是简单题吗。。。(发抖)
因为不让使用 “+”、“-”、“*”、“/” ,故考虑将其拉到二进制内通过位运算进行降维打击!
二进制下加法:
- 进位,只有
a
、b
同时为1
时进位为1
。等价于&
运算且左移一位; - 本位,等价于异或
^
。
故而,加法运算转变为上述位运算,满足题目要求。目标和转变为进位 + 本位,又是加法,进而可以在转变为上述位运算算法。当进位 ==
0时,目标和等于本位,即返回本位值。
那如果有负数怎么办?在计算机系统中,数值一律用补码来表示和存储。补码的优势: 加法、减法可以统一处理(CPU只有加法器)。因此,以上方法同时适用于正数和负数的加法 。
代码实现
class Solution {
public:
int add(int a, int b) {
while(b){
int c = (unsigned int)(a & b) << 1;//c++中,负值不允许左移
a ^= b;
b = c;
}
return a;
}
};
运行结果: