剑指 Offer 65. 不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1 输出: 2
提示:
a
,b
均可能是负数或 0- 结果不会溢出 32 位整数
解析:
^异或:无进位加法
&按位与:两个数按位与后,结果为每一位的进位
将按位与的结果左移一位 + 异或的结果 是不是就相当于 无进位结果 + 进位
因为不能使用加法,所以令a = 将按位与的结果左移一位的数, b = 异或的结果
循环执行,直到进位为0,即将按位与的结果左移一位的数为0
还要注意负数不支持左移,按位与后强转为unsigned int
class Solution { public: int add(int a, int b) { int carry = a, base = b; do{ int temp = base; base = base ^ carry; carry = (unsigned int)(temp & carry) << 1; }while(carry); return base; } };