1.题目
2.思路
不能用加减乘除。那必然就是位运算了。其实这是计算机组成的内容,负数用补码存储。不管正负数,CPU都可以用同一套计算方法来计算加法。
假如不考虑进位来说的话,那么a 加 b 就等于 a 异或 b。这时候再考虑进位 等价于a & b.这个进位又需要和前面的异或的值再相加。所以进位记得左移。
可以举例子。3 + 7,用二进制表示:
011
111
第一步:计算a ^ b = 1 0 0
第二步:计算最后一个的进位:a & b = 1, 1 要左移一位,变成010.
第三步:重复第一步,再把第一步和第二步得到的值异或:100 ^ 010 = 110
第四步,重复第二步,计算进位:110 & 010 = 10,左移一位,100.
继续不断重复,知道进位为0即可。
class Solution {
public int add(int a, int b) {
if(a == 0 || b == 0)return a ^ b;
while(b != 0){
// 进位用与运算 --temp(记得移动这个进位)
// 无进位和用异或运算 --temp2
int temp = (a & b) << 1;
int temp2 = a ^ b;
a = temp2;
b = temp;
}
return a;
}
}
针对负数的情况,也是一样的计算方式
3.结果