不用加减乘除做加法

1.题目

在这里插入图片描述

2.解法(位运算)

思路:
(1)十进制中,17 + 5,求和分为二步走:

  • 各位相加,先不进位,1+0=1, 7+5=2, 结果为12
  • 接着进位,7+5进位1, 所以为10
  • 现在变成12 + 10,接着和前两步相同的方式,相加,1+1=2, 2+0=2, 等于22,此时没有进位了,所以结果为22
    可以看出前两步为循环体,有进位为循环条件
    (2)和十进制类似的方式
    17的二进制为10001, 5为101
    -每位相加,先不进位,10100(相加操作由位运算异或完成,相同为0,不同为1,1+0=1, 0+1 = 1, 1+1=0, 0+0=0,正好不进位)
    -求进位,由&完成(同为1为1,不同为0, 1+1=1,然后通过向左移动1位,来获得进位后的值)
    -相加得到的值+进位结果,重复上面的两步,直到没有进位为止
public class Solution {
    private int sum;
    private int carry;
    
    public int Add(int num1,int num2) {
        do{
            sum = num1 ^ num2;
            carry = (num1 & num2) << 1;
            num1 = sum;
            num2 = carry;
        }while(num2 != 0);
        return num1;
    } 
}

时间复杂度为O(n),空间复杂度为O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值