题目
不使用运算符 + 和 - ,计算两整数 a 、b 之和。
示例 1:
输入: a = 1, b = 2
输出: 3
示例 2:
输入: a = -2, b = 3
输出: 1
思路
通过观察异或运算的真值表,与加法的真值表特别地像。需要注意的是异或只看本位,加法可能需要进位。从而用到与运算&
1 0 1
1 1 1
0 1 0
0 0 0
与运算可以很好地解决加法进位的问题,加法进位和 与 运算结果 对应:1+0、0+1、0+0的进位都是0, 1+1的进位为1。
通过异或得到了本位和,通过与运算得到了进位值,最后,只需要将进位值给高一位即可。
算法知识点补充
运算符详细见
1.与运算符
与运算符用符号“&”表示,其使用规律如下:
两个操作数中位都为1,结果才为1,否则结果为0,例如下面的程序段。
public class data13
{
public static void main(String[] args)
{
int a=129;
int b=128;
System.out.println(“a 和b 与的结果是:”+(a&b));
}
}
运行结果
a 和b 与的结果是:128
下面分析这个程序:
“a”的值是129,转换成二进制就是10000001,而“b”的值是128,转换成二进制就是10000000。根据与运算符的运算规律,只有两个位都是1,结果才是1,可以知道结果就是10000000,即128。
移位运算符
a右移一位,写成a<<=1; 等同a=a<<1;
代码
/*
* @lc app=leetcode.cn id=371 lang=java
*
* [371] 两整数之和
*/
// @lc code=start
class Solution {
public int getSum(int a, int b) {
while(b!=0){
int carry = (a&b)<< 1;
a = a^b;
b = carry;
}
return a;
}
}
// @lc code=end