CPP剑指 Offer 65. 不用加减乘除做加法

题目描述:

写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1
输出: 2

提示:
a, b 均可能是负数或 0,结果不会溢出 32 位整数

解题思路

不能使用加减乘除四则运算,所以只能返本溯源想到使用二进制的位运算实现相加操作。
二进制位运算中,异或操作: 1^1=0 0^0=0 1^0=1 0^1=1,可以模拟无进位的加操作;
与操作:1&1=1 0&1=0 1&0=0 0&0=0,可以模拟进位的情况,再将与后的值左移一位即等于进位值。
普通的十进制数相加过程是:

  1. 各位相加,无进位和 2) 计算进位值 3) 无进位和加上进位值
    使用位运算的二进制数的相加过程相同:
  2. 两个二进制数各位异或,得到无进位的和 2) 二进制数各位与再左移,计算进位 3) 无进位和与进位异或
    重复上面操作,直到不再有进位,即进位为0。

需要注意的点是:CPP中不支持负数的左移,所以需要:(unsigned int)(a & b)

代码:

int add(int a, int b){
    int sum_tmp = 0;
    int carry   = 0;
    
    while(b != 0)
    {
        sum_tmp = a ^ b;
        carry = (unsigned int)(a & b) << 1;//为什么是左移,因为是进位?

        a = sum_tmp;
        b = carry;
    }
    return a;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值