【剑指Offer-发散思维能力】不用加减乘除求两数的和

题目描述

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

思路解析

异或运算示例

 0000 0011
^0000 0001
 0000 0010

1. 首先将两个数字进行异或运算,得到的结果是如果两数对应位不同为1且不同为0,那么该位上对应的值相加后被保留。
与运算实例

 0000 0011
&0000 0001
 0000 0001
  1. 再将两个数字进行与运算,运算结果是,如果对应位都为1,那么该位在异或运算中变为0,但是需要进位。
    根据上面的运算结果,我们可以将第二步运算结果向左移动1位,与第一步运算结果继续进行第一步第二步。直到第二步运算结果为0时,结束即可。

    代码实现
public class Solution {
    public int Add(int num1,int num2) {
        if(num2 == 0){
            return num1;
        }
        // 对应位为01,10运算后结果为1,对应位为00,11运算后结果为0
        int xOrResult = num1 ^ num2;
        // 对应位11的抑或后需要进位
        int carry = (num1 & num2) << 1;
        return Add(xOrResult,carry);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值