剑指Offer:不用加减乘除作加法

本文介绍了一种不使用基本算术运算符实现两个整数相加的方法。利用位运算,如按位与、按位或及按位异或等,巧妙地实现了加法运算。该算法通过不断迭代直到不再产生进位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
就很恶心。我个人感觉被恶心到了。

思路是这样的:对于两个数a1和b1,比如说5和7,101和111

  • 按位与,结果为101。如果与的结果存在某个位为1,说明a和b两个数,的二进制数中,存在相同的位为1的情况,记为进位位。因为该位置,两个数对应位置都为1,产生进位,进位的值为1;产生的这个进位是要加到前面一位上的。所以对按位与的结果进行向左移位1位的操作,结果为a,供之后使用。
  • 如果按位与的结果中,不存在某一位为1,即按位与的结果为0,说明这两个数的二进制位每一位都不产生冲突(没有哪一位,两个数在该为都为1)。则直接进行a|b(对应位相加,即可的结果。返回。)
  • 按位异或,结果为010。如果异或的结果中存在某个为为1,说明在原本的二进制数中,该位只有一个数取值为1,即不会产生进位,记为非进位位;记异或的结果为b
  • 此时,计算a+b的结果,其实就等于a1+b1的结果。由于不能使用+运算,所以重复上面的步骤,直至按位yu的结果为0,即可停止,通过|操作,获得两个数的和。
    public int Add(int num1,int num2) {
        int a = (num1 & num2) << 1;
        int b = (num1 ^ num2);
        while((a & b) != 0){
            num1 = a;
            num2 = b;
            a = (num1 & num2) << 1;
            b = (num1 ^ num2);
        }
        return (a | b);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值