剑指 Offer 65. 不用加减乘除做加法

剑指 Offer 65. 不用加减乘除做加法

写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。

 

示例:

输入: a = 1, b = 1
输出: 2

 

提示:

  • ab 均可能是负数或 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;
    }
};

 

posted @ 2022-07-29 19:31  WTSRUVF  阅读(17)  评论(0编辑  收藏  举报