写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
解析:不用加减乘除,那就只能用位运算了,假设要相加两位数为11(1011)与21(10101),二进制相加与十进制相加是一样的,相同位置的数加上进位的就是该位的运算和。同等位数相加有如下情况:
1+0->1 1+1->0 0+1->0 0+0->0
亲,这跟异或是不是有点像呢,所以可以用异或解决同位置的加法运算,至于进位情况如下:
1+1->1 1+0->0 0+1->0 0+0->0
这跟与运算刚好一样,终于看到希望了
综上所述:先将要相加的数a和b进行异或运算得到c,再将a和b进行与运算得到d,再将d左移一位(因为是进位),将c与d相加就得到最终结果,下面就让我们来验证一下,就以11(1011)和21(10101)为例:
1 0 1 1
^ 1 0 1 0 1
——————
1 1 1 1 0
1 0 1 1
& 1 0 1 0 1
________________
0 0 0 0 1
1 1 1 1 0
+ 0 0 0 1 0
——————
1 0 0 0 0 0
由上面运算可以看到与预料的结果一样,所以该方法是可取的
代码:
int add(int num1 ,int num2){
if(num2==0) return num1;
int a=num1^num2;
int b=(num1&num2)<<1;
return add(a,b);
}