leetcode371—两整数之和

Hello,各位学习编程的小伙伴,今天我们一起看一下leetcode的第371题。

首先,我们先来看一下题目要求。

给你两个整数,要求不使用运算符“+” 或者“-”,从而计算并返回两整数之和

示例1:

输入: a = 1 ,b = 2

输出: 3 

 示例2:

输入:a = 2,b = 3

输出: 5

 我们的要求是不使用运算符”+“ 和”-“,相信很多大佬对这道题心里已经有了思路。没错就是位运算。

注:位运算就是直接对整数在内存中的二进制位进行操作

对于这道题:我先讲解一下我的思路

当两个数相加时,我们先可以采用一个异或运算将两个数不相同的位数算出来。

我们异或运算的原理就是将两个十进制数转换成二进制,从高到底进行位运算只有当两个位不相同时,才为1,否则为0。

下图示例:就可以得出我们的数据是3(时间匆忙,会意即可)

b27c9d58a7c240edaedd51f23656a10f.png

 但是,如果我们的两位数字之间有两位均为1.那我们又该如何。

莫慌,待我们降伏它!!!

 这时候我们就可以用一个位与运算&去解决它。

位与运算:将两个十进制数转换成二进制,从高到底进行位运算只有当两个位都为1时,才为1,否则为0

示例:

e778715568ff4ac99deb0697db7f1424.png

 我们可以看到成功的一个一被消去了只留了一个一,但是结果依旧为2,这是时候我们让这个结果向左偏移一位即可。向左偏移后,最右的位置会自动填补0.

e36ceaf8754945b19334920b9a34dbd6.png

 然后我们在编写代码时,将两个结合起来即可。

接下来,附上源码,以及示例2演示图。

图解以及注释认真观看哦!!!

7857d08b418b41859a1e2ff7e460c707.png

169733bacd634bb8a8edba1818510c28.png

 

class Solution {
    public int getSum(int a, int b) {
        int j ;

        while(true){
            //获取两个数异或运算后的数值
           j = a ^ b;
            //获取两个数位与运算后的数值,并进行向左偏移一位
            int k  = (a & b) << 1;
            //如果我们的位与运算的值为0,则两数无相同”1“位,中断循环
            if(k == 0){
                break;
            }
            //如果位与运算不为0,则将j赋值给a,k的值赋值给b。继续循环,直到k的值为0.
        a = j ;
        b = k ;
        }
        //最后我们的j就是我们要的结果
        return j;
    }
}

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值