写在前面:
首先这道问题,不允许使用加减乘除,那么我们首先想到的就应该是位运算以及移位运算。
移位运算:
(1)<<左移运算符,eg:num<<1相当于num*2
(2)>>右移运算符,eg:num>>1相当于num/2
(3)>>>无符号位右移运算符,eg:num>>>1,忽略符号位,空位都以0补齐
位运算:
(1)位与:
(2)异或:num1^num2
那么在回顾了这些位运算以及移位运算之后,我们来看一下这道题的大致思路
首先我们来看一下十进制的5+7=12是怎么实现的
第一步:相加各个位的值,不算进位,得到2.
第二步:计算进位值,得到10(如果这一步的结果为0,则最后的结果=第一步的结果)
第三步:重复上述两步,用上述两步得到的结果2+10=12.
然后我们再来看一下二进制的5+7=12是怎么实现的,5的二进制是101,7的二进制是111
第一步:相加各位的值,不算进位,101+111 得到 010,这一步的操作相当于各位做异或操作,即num1^num2
第二步:计算进位值,我们只计算第一位和第三位的位与值,也就是=1010, 这一步操作,又相当于101&111,再左移1位,即(101&111)<<1,
第三步:重复上述两步,用第一步的结果010+第二步的结果1010,由于又有进位,所以还要重复进行第一步,第二步的运算,直到进位为0,返回相应的,第一步的结果值。
代码实现如下:
public int Add(int num1, int num2) {
// 循环终止条件:进位为0
while (num2 != 0) {
int temp = num1 ^ num2;// 相加不进位
num2 = (num1 & num2) << 1;
num1 = temp;
}
return num1;
}