剑指offer-面试题47:不用加减乘除做加法

题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

思路:四则运算都不能用只能位运算了。其实第一想法就是位运算,位运算转换成二进制才能看出规律,这步是关键!例如4+7,二进制是101+111,考虑二进制的加法,先不考虑进位,101+111结果是010,很明显各个位上做了异或运算。下一步考虑进位,最低位和最高位都产生了进位,进位的结果是1010,最低位产生的进位左移了一位,最高位产生的进位也左移了一位,而且只有在两位同时为1的情况下才会产生进位,所以进位的生成可以看成是位与然后左移一位。最终的结果就是不考虑进位的和与进位相加,010+1010,计算到这里实际上又要重复前面的步骤,直到没有了进位。

int Add(int num1, int num2)
{
    int sum, carry;
    do
    {
        sum = num1 ^ num2;
        carry = (num1 & num2) << 1;
        
        num1 = sum;
        num2 = carry;
    }
    while(num2 != 0);
    
    return num1;
}


你可能感兴趣的:(剑指offer-面试题47:不用加减乘除做加法)