本题 题目链接
题目描述
我的题解
位运算
思路分析
- 既然不能用加减乘除,那想想,就只剩下位运算符了似乎:
&
(按位与)|
(按位或)^
(按位异或)~
(按位取反)<<
(按位左移)>>
(有符号的按位右移)>>>
(无符号的按位右移)
- 然后我们想想,再结合之前对位运算的经验(没啥经验的就拿两个数,一边算算过程,一边体会一下怎么可以和加法扯上关系)
然后尝试运算过程中你会发现:- 异或运算^:相当于 不进位 的加法。
(然后想想,那 什么位运算 可以 计算出每次的进位呢?) - 按位与&:相当于 进位。(because: 只有同为 1,&运算结果才为 1;而对于加法来说,只有两个 1 才有进位 1。这不就匹配上了吗!)
- 既然是进位,那就是高一位的数要加1。故而,需先把按位与的结果左移一位,再和异或的结果进行异或运算。
- 异或运算^:相当于 不进位 的加法。
- 最后,我们知道,只有当两个数相加,没有进位的时候,异或运算得出的结果才是相加的结果。所以,只有当按位与运算的结果为0的时候,才可以呀!
代码如下
public int add(int a, int b) {
int xor, and;
while (true) {
xor = a ^ b;
and = a & b;
if (and == 0) break;
a = xor;
b = and << 1;
}
return xor;
}