阅读 66

371. 两整数之和

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

371. 两整数之和

给你两个整数 a 和 b ,不使用 运算符 + 和 - ​​​​​​​,计算并返回两整数之和。

思路分析

这道题有点意思,所以说就应该好好学学CSAPP嘛,直觉上就是用位运算来解。

0 + 0 = 0 
0 + 1 = 1
1 + 0 = 1 
1 + 1 = 0 (进位)
复制代码

一般来说,不考虑的进位的情况下,我们可以直接用a异或b得到结果,

但是考虑进位的情况下就需要在a异或b的基础上,进一步计算出进位,并将进位的结果相加到原和上。

有:

0 + 0 = 0 
0 + 1 = 0
1 + 0 = 0 
1 + 1 = 1
复制代码

很明显是a&b了,不过要考虑进位后位数+1,因此进位的结果为 a & b << 1.

不过要考虑到进位相加以后还有进位,因此必须不断循环知道进位为0,有代码:

int getSum(int a, int b) {
    while (b != 0) {
        int carry = (int)(a & b) << 1;
        a = a ^ b;
        b = carry;
    }
    return a;
}
复制代码

总结

说到位运算,也提了CSAPP,不妨借花献佛给各位读者展示下题目。

1, 在不使用异或的情况下表示a^b

给个思路,这类题最重要的就是要对公式进行推导:

截屏2021-09-26 下午10.42.53.png

答案:

1.(a|b)&(~a|~b)
2.~(~a&~b)&~(a&b)
3.(a&~b)|(~a&b)
复制代码
int bitXor(int x, int y) {
  return ~(~x&~y)&~(x&y);
}
复制代码
文章分类
后端