Hello,各位学习编程的小伙伴,今天我们一起看一下leetcode的第371题。
首先,我们先来看一下题目要求。
给你两个整数,要求不使用运算符“+” 或者“-”,从而计算并返回两整数之和
示例1:
输入: a = 1 ,b = 2
输出: 3
示例2:
输入:a = 2,b = 3
输出: 5
我们的要求是不使用运算符”+“ 和”-“,相信很多大佬对这道题心里已经有了思路。没错就是位运算。
注:位运算就是直接对整数在内存中的二进制位进行操作
对于这道题:我先讲解一下我的思路
当两个数相加时,我们先可以采用一个异或运算将两个数不相同的位数算出来。
我们异或运算的原理就是将两个十进制数转换成二进制,从高到底进行位运算只有当两个位不相同时,才为1,否则为0。
下图示例:就可以得出我们的数据是3(时间匆忙,会意即可)
但是,如果我们的两位数字之间有两位均为1.那我们又该如何。
莫慌,待我们降伏它!!!
这时候我们就可以用一个位与运算&去解决它。
位与运算:将两个十进制数转换成二进制,从高到底进行位运算只有当两个位都为1时,才为1,否则为0
示例:
我们可以看到成功的一个一被消去了只留了一个一,但是结果依旧为2,这是时候我们让这个结果向左偏移一位即可。向左偏移后,最右的位置会自动填补0.
然后我们在编写代码时,将两个结合起来即可。
接下来,附上源码,以及示例2演示图。
图解以及注释认真观看哦!!!
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;
}
}