剑指offer--不用加减乘除做加法

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

不能使用四则运算,考虑用位运算,位运算针对的是二进制。

|或   ^异或  &与

异或运算:同为0,异为1:0+0=0;1+1=0;1+0=1;0+1=1

位与运算:相同位的两个数字都为1,则为1;若有一个不为1,则为0

以5+17=22为例:

第一种情况:十进制做加法

1)只做各位相加,不进位:

                     个位数:5+7不进位是2   十位数:0+1是1

2)做进位:5+7有进位,进位值为10

3)前面两个结果相加:12+10=22即5+17=22

第二种情况:二进制

5的二进制      101

17的二进制10001

1)各位相加不进位:10100(两个都是1相加有进位)(101^10001)

2)做进位:只有最有一位相加时产生了进位(101&10001)<<1

3)前面两个结果相加:10110 转换成十进制为22

class Solution {
public:
    int Add(int num1, int num2)
    {
        int sum;carry;% 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、付费专栏及课程。

余额充值