小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
371. 两整数之和
给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。
示例 1:
输入:a = 1, b = 2 输出:3 示例 2:
输入:a = 2, b = 3 输出:5
提示:
- -1000 <= a, b <= 1000
解题思路
在位运算操作中,异或的一个重要特性是无进位加法。例如:
a = 5 = 0101
b = 4 = 0100
a ^ b 如下:
0 1 0 1
0 1 0 0
-------
0 0 0 1
因此,我们使用异或位运算模拟计算机的二进制加法.
- 维护一个变量in,代表二进制的进位
- 获取a,b每一位的取值情况,在不产生进位的情况下,(a1,b1代表a,b当前位的二进制取值)当前位的结果即为a1^b1^in,并且判断进位情况,只有当a1和b1都为1,或者a1,b1其他一个为1,in为1的情况下,才能产生进位
代码
class Solution {
public int getSum(int a, int b) {
int in=0,res=0;
for(int i=1;i<=32;i++)
{
int a1=a&1,b1=b&1;
int cur=(a1^b1^in);
res^=(cur<<(i-1));
if(a1==1&&b1==1||(a1^b1)==1&&in==1)
{
in=1;
}else in=0;
a>>=1;
b>>=1;
}
return res;
}
}
- 时间复杂度:O(C),C 为常数,固定为 32
- 空间复杂度:O(1)
代码
利用(a&b)二进制表示为1的位,是a+b中需要进位的位,所以我们可以根据需要进位的二进制位构造出一个因为进位而产生加数(a&b)<<1,继续循环加法操作,直到不存在进位
public int getSum(int a, int b) {
int in=0,res=0;
while(b!=0)
{
int c=(a&b)<<1;
a=a^b;
b=c;
}
return a;
}