如题,不使用算数运算符,那只能通过逻辑运算符来进行解答。我们知道,所有数据在计算机中都是以二进制存储的。对于int型数字来说,正数补码==源码;负数补码==反码+1。
按位运算,两数异或(^)其结果为不含进位的结果。比如7->111 + 2->10,异或结果为101;而进位carry位信息我们可以通过两数的与(&)运算得到,将其按位左移与异或结果再次异或,直到无进位信息,所得结果就是最终两数之和。
代码如下:
class Solution {
public:
int add(int a, int b) {
while(b!=0)
{
int sum=a^b;
int carry=(unsigned)(a&b)<<1;
a=sum;b=carry;
}
return a;
}
};
注意,在C/C++中,需要将进位结果转换为无符号整型,原因是开始两数异或已经包含符号位信息。
如有不足之处,希望大伙提出,共同讨论,一同进步。