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

题目描述

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

题目解析

题目比较明确,不用加减乘除的方式来计算两个数字的和,应该很自然的想到用与或非等逻辑运算以及位移作为辅助的方式来计算其值。


解题思路

模拟一个加法的过程

5 + 1

101

00 1

------

110

这里面涉及到了进位,如果去掉进位来看,也就是末尾的1+1进位转为0了,那么现在的数为100,然后进位数字为1,进位1位相当于1<<1,然后再不考虑进位的情况下继续加法算出其值,也就是110,然后这时候,计算进位为0,也就是说不进位,那么这个计算出来的值就是结果,当然,如果说是7+1的话需要不断的进位,这个时候就是一个进位与在不考虑进位值的情况下计算出来的值的一个不断叠加的过程,那么,不考虑进位值这个过程对应于逻辑运算应该是异或,而进位过程应该是求两者的&运算,相同的值都为1的时候,存在进位。


代码实现

public class Solution {
    public int Add(int num1,int num2) {
        
        while(num2 != 0) {
            
            int temp = (num1 ^ num2); 
            num2 = (num1&num2) << 1;
            
            num1 = temp;
        }
        return num1;
    }
}
先求出两者不考虑进位的情况下的和,然后求出进位,判断进位是不是0,不是0就说明存在进位,那么就要继续将当前的值重复这一过程。


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值