45、不用加减乘除做加法

题目:

求两个整数的和,要求函数中不能使用+、-、*、/ 四则运算符号。

解法:

1、考虑到整数的运算不能使用加减乘除,那么只有位运算可以使用。

2、将a+b转换成add(c,d)的模式。其中c为a+b在二进制表达的过程中未进位的结果。

d为a+b在二进制表达中进位的结果。

举例:例如a = 10101 ,b=10001; 首先利用a^b得到未进位的结果。即在二进制表达中

0+1=1+0=1,0+0=1+1=0,这与^的运算结果一致。相当于十进制中5+8=3一样。

再计算a+b在二进制表达中进位的结果。a+b在二进制表达中又进位的唯一情况为1+1的情况,

在例子中即为 (a&b)=00001,表示第一位生成进位,然后(a&b)<<1 即为进位后的值。

最终:a+b = add(c,d) 其中 c = a^b , d=(a&b)<<1;

代码如下:

    int Add(int num1, int num2)
    {
        if(num2==0)
            return num1;
        int no_carry = num1^num2; //不算进位的和
        int carry = (num1 & num2)<<1; //进位
        num1 = no_carry;
        num2 = carry;
        return Add(num1,num2);
    }

你可能感兴趣的:(剑指offer)