剑指Offer65.不用加减乘除做加法

题目:写一个函数,求两个整数之和,要求在函数体内部不得使用“+”、“—”、“×”、“÷”四则运算符号。
思路:数的运算无非是加减乘除或位运算,既然不可以用加减乘除,只能考虑位运算。
接下来考虑位运算如何实现,首先分析十进制加法是如何实现的。比如5+17=22,第一步,个位相加,7+5=12;第二步,进位;第三步,将前面两步相加10+12=22。
接下来位运算的实现:17的二进制位10001,5的二进制为101。首先第一步:个位相加,得到的结果10100(暂时不进位);第二步:进位,二进制最后一位都是1,相加结果为二进制的10;第三步:前两步相加,结果为10110,等于22。
接下来思考如何在计算机中实现:首先考虑是否存在异常或可特殊处理的情况,当两个数字全为0时,结果为0;当仅有一个为0时,等于另外一个数值;其他情况的处理:题目需实现的相加为二进制中1+0=1;1+1=0;0+1=1;0+0=0;符合异或运算;那么进位如何实现呢?可以想到只有当1+1时才产生进位,相当于向左移动一位。
C++代码实现:

class Solution {
public:
    int add(int a, int b) {
        int sum,carry;
        if(a == 0 || b == 0){
            return a == 0 ? b : a;
        }
        do{
            sum = a^b;
            carry = (unsigned int)(a & b) << 1;
            a = sum;
            b = carry;
        }while(b != 0);

        return a;

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值