位运算实现加法&&剑指 Offer 65. 不用加减乘除做加法

本文探讨了如何使用位运算符在Java和C++中实现两个整数的加法,重点在于处理进位。通过循环和位操作,避免使用加减乘除。对于C++,由于负数左移可能溢出,需要使用`unsigned int`进行类型转换。同时提供了递归版本的解决方案。
摘要由CSDN通过智能技术生成

a + b = (a ^ b) ^ ((a & b)) << 1;循环至进位数为0为止。

abn(无进位和)c(进位)
0000
0110
1010
1101

参考了大佬的题解:
面试题65. 不用加减乘除做加法(位运算,清晰图解)

1.java提交可以过

class Solution {
    public int add(int a, int b) {
        while(b!=0){
            int c=(a & b)<<1;
            a ^= b;
            b = c;
        }
        return a;
    }
}

2.c++按以上代码提交过不了,因为有负数时左移会溢出,故要加 unsigned int强制类型转换

参考了力扣c++题解别人的处理方法。

class Solution {
public:
    int add(int a, int b) {
        while(b){
            int c = a & b;
            c = (unsigned int)c<<1;     //有负数时不强转会溢出,故需要转换为无符号整数
            a ^= b;
            b = c;
        }
        return a;
    }
};

3.c++递归版本,原理差不多

参考了力扣评论区

class Solution {
public:
    int add(int a, int b) {
        return b==0?a:add(a^b,(unsigned int)(a&b)<<1);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值