剑指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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值