又是关于二进制的技巧题目。
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
class Solution {
public:
int add(int a, int b) {
while (b!=0) {
int temp = a^b;
b = (unsigned)(a&b)<<1;
a = temp;
}
return a;
}
};
其中,异或表示不进位的相加。
与表示只有两个1才能变成1,也就是进位,那么要做到1+1=10,就需要进位。
因此,(a&b)<<1,就表示进位。
先将两数相加的末位存起来,然后判断有无进位,再将存起来的数字赋给加数。
因此最后就得到了加法运算。
需要注意的是:其中位运算有可能出现错误:
runtime error: left shift of negative value -2147483648 (solution.cpp)
左移的高位如果超过符号位,就会报错。
因此要用类型强制转换来unsigned来接住。