JZ48 不用加减乘除做加法**

题目描述

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

思路

加法归纳起来就是三步走
比如5+17
(1) 做各个位相加,不进位:12(十位:0+1=1;个位:5+7=12,但是不进位);
(2) 做进位,进位的数是多少(进位是10)
(3)以上两个数相加:12+10=22

对数字做运算,除了四则运算外,就只有位运算了
位运算是对于二进制来说的,,那就来分析一下三步走策略对于二进制是否适用;
5(101)+17(10001)
(1) 各个位相加不进位:10100
(2) 进位:10
(3) 相加:10110

接着将二进制加法用位运算代替
(1) 各个位相加不进位:0+1->1;1+0->1;1+1->0;0+0->0--------->就是异或运算
(2) 进位:只有1,1才有进位,所以可以看成是先位与运算,然后左移一位
(3) 上面两步相加:依然重复前面两步,直到不产生进位

代码

class Solution {
public:
    int Add(int num1, int num2)
    {
        int sum,carry;  //num是求和,carry是进位
        do
        {
            sum=num1^num2;
            carry=(num1&num2)<<1;
            num1=sum;
            num2=carry;
        }
        while(num2!=0);
        return num1;

    }
};
全部评论

相关推荐

粗心的雪碧不放弃:纯学历问题,我这几个月也是一直优化自己的简历,后来发现优化到我自己都觉得牛逼的时候,发现面试数量也没有提升,真就纯学历问题
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务