小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
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
给个思路,这类题最重要的就是要对公式进行推导:
答案:
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);
}