剑指offer48--不使用加减乘除实现加法运算

题目描述

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

思路

逻辑运算
先来捋清加法是如何实现的——

  1. 对于2个二进制数相加:
n11011
n21001
10010

00得0,11得0;01、10得0即相同为0,不同为1,是典型的异或运算。
因此在没有进位的情况下,直接异或就能得到加法结果。

  1. 有进位的加法

进位是如何来的——2个1相加产生进位。
因此只需要找到两个相同位置上都是1的即可——典型的与运算。
找到产生进位的位置后,怎么利用?
进位的结果是在前一位+1,也就是需要把1往前移动一位——即左移运算。

因此整体思路就是:
1.检测是否有进位。(检测n2是否为0,在第一轮中,n2为0直接返回n1了;在后续的过程中,将异或的结果给n1,将进位信息(即与的结果左移一位之后)给n2)
2.一直循环到没有进位了,即n2为0,停止
3.返回n1

实现:

public:
    int Add(int num1, int num2)
    {
        while (num2!=0)
        {
            int temp=num1^num2;//暂存异或结果(即无进位加法的结果)
            num2=(num1&num2)<<1;//寻找进位位置,并且将其左移一位
            num1=temp;//把异或结果给n1,准备下一轮检测
        }
        return num1;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值