题目描述:
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1
输出: 2
提示:
a, b 均可能是负数或 0,结果不会溢出 32 位整数
解题思路
不能使用加减乘除四则运算,所以只能返本溯源想到使用二进制的位运算实现相加操作。
二进制位运算中,异或操作: 1^1=0 0^0=0 1^0=1 0^1=1,可以模拟无进位的加操作;
与操作:1&1=1 0&1=0 1&0=0 0&0=0,可以模拟进位的情况,再将与后的值左移一位即等于进位值。
普通的十进制数相加过程是:
- 各位相加,无进位和 2) 计算进位值 3) 无进位和加上进位值
使用位运算的二进制数的相加过程相同: - 两个二进制数各位异或,得到无进位的和 2) 二进制数各位与再左移,计算进位 3) 无进位和与进位异或
重复上面操作,直到不再有进位,即进位为0。
需要注意的点是:CPP中不支持负数的左移,所以需要:(unsigned int)(a & b)
代码:
int add(int a, int b){
int sum_tmp = 0;
int carry = 0;
while(b != 0)
{
sum_tmp = a ^ b;
carry = (unsigned int)(a & b) << 1;//为什么是左移,因为是进位?
a = sum_tmp;
b = carry;
}
return a;
}