1.题目
2.解法(位运算)
思路:
(1)十进制中,17 + 5,求和分为二步走:
- 各位相加,先不进位,1+0=1, 7+5=2, 结果为12
- 接着进位,7+5进位1, 所以为10
- 现在变成12 + 10,接着和前两步相同的方式,相加,1+1=2, 2+0=2, 等于22,此时没有进位了,所以结果为22
可以看出前两步为循环体,有进位为循环条件
(2)和十进制类似的方式
17的二进制为10001, 5为101
-每位相加,先不进位,10100(相加操作由位运算异或完成,相同为0,不同为1,1+0=1, 0+1 = 1, 1+1=0, 0+0=0,正好不进位)
-求进位,由&完成(同为1为1,不同为0, 1+1=1,然后通过向左移动1位,来获得进位后的值)
-相加得到的值+进位结果,重复上面的两步,直到没有进位为止
public class Solution {
private int sum;
private int carry;
public int Add(int num1,int num2) {
do{
sum = num1 ^ num2;
carry = (num1 & num2) << 1;
num1 = sum;
num2 = carry;
}while(num2 != 0);
return num1;
}
}
时间复杂度为O(n),空间复杂度为O(1)