剑指offer—不用加减乘除做加法
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1
输出: 2
提示:
a, b 均可能是负数或 0
结果不会溢出 32 位整数
思路
题目要求不能用+,-,*,/,那么只能考虑位于运算:&,^,|,~,<<,>>
首先我们知道 a ^ b(a 异或 b)是不进位的加法,而 (a & b) << 1 是进位
那么将这两个加起来 (a ^ b) + ((a & b) << 1) 就是计算 a + b 拉
但是这时候又出现了 + 法,怎么办呢?不要着急,可以令 a = (a & b) << 1,b = a ^ b,然后再执行 a + b 就可以拉
那这样一直套进去,什么时候是个头呢?
看看 << 1 操作,左移一位,最低位补 0,总有一次,整个数都被 0 填满,那么也就是没有进位,即停止 + 法循环
最后返回 b 即可
代码
int add(int a, int b) {
//若还有进位,则继续加法
while(a != 0)
{
int temp = a^b;
a = (unsigned int)(a&b)<<1;
b = temp;
}
return b;
}