题目:写一个函数,求两个整数之和,要求在函数体内部不得使用“+”、“—”、“×”、“÷”四则运算符号。
思路:数的运算无非是加减乘除或位运算,既然不可以用加减乘除,只能考虑位运算。
接下来考虑位运算如何实现,首先分析十进制加法是如何实现的。比如5+17=22,第一步,个位相加,7+5=12;第二步,进位;第三步,将前面两步相加10+12=22。
接下来位运算的实现:17的二进制位10001,5的二进制为101。首先第一步:个位相加,得到的结果10100(暂时不进位);第二步:进位,二进制最后一位都是1,相加结果为二进制的10;第三步:前两步相加,结果为10110,等于22。
接下来思考如何在计算机中实现:首先考虑是否存在异常或可特殊处理的情况,当两个数字全为0时,结果为0;当仅有一个为0时,等于另外一个数值;其他情况的处理:题目需实现的相加为二进制中1+0=1;1+1=0;0+1=1;0+0=0;符合异或运算;那么进位如何实现呢?可以想到只有当1+1时才产生进位,相当于向左移动一位。
C++代码实现:
class Solution {
public:
int add(int a, int b) {
int sum,carry;
if(a == 0 || b == 0){
return a == 0 ? b : a;
}
do{
sum = a^b;
carry = (unsigned int)(a & b) << 1;
a = sum;
b = carry;
}while(b != 0);
return a;
}
};