剑指 Offer 65. 不用加减乘除做加法【中等】
不能用加减乘除的题,要考虑位运算。
设两数字的二进制形式a,b,s=a+b,a(i)代表a的二进制的第i位,则分为以下四种情况:
a(i) | b(i) | 无进位和n(i) | 进位c(i+1) |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
观察发现,无进位和==异或运算 规律,进位==与运算 规律(需左移一位),因此 n 和 c 的计算公式如下:
n=a⊕bn=a \oplus bn=a⊕b,非进位和:异或运算
c=a&b<<1c=a \& b<<1c=a&b<<1,进位:与运算+左移一位
由于 和s=非进位和n + 进位和c,即s=a+b=>s=n+c
循环求n和c,直到进位c=0;此时s=n,返回n即可。举例20+17如下:
Q:如果a或者b是负数,怎么办?
A:计算机系统中,数值一律用补码来表示和存储
补码的优势:加法、减法可以统一处理(CPU只有加法器)
因此,以上方法同时适用于正数和负数的加法。
class Solution {public int add(int a, int b) {while(b!=0){int c=(a&b)<<1;//进位ca^=b;//非进位和ab=c;//进位b}return a;}
}
时间复杂度:O(1)O(1)O(1)
空间复杂度:O(1)O(1)O(1)