标签:public 代码 结果 思路 运算 就是 pre 相加 sum
题目:使用位运算求a和b的和,两个整数a和b,其中0<=a,b<=100。
分析:a+b=a^b+(a&b)<<1
其中a^b为异或运算,本质上可以看作不进位加法;后面的a&b为与运算,相同位上都为1则结果才为1,其它情况则结果为0,我们只需要将与运算左移一位,则可以看成是进位运算。所以,两者结合就是完成的加法运算。
由于题目中要求只用位运算求和,由于a+b和(a&b)<<1也是两数相加,而且a+0=a,所以我们可以将上述思路最后的“两者结合”用递归或循环的方式完成。直到递归或循环到b=0,这时return a;即可。
代码:
//递归实现
public class Solution01 {
public int sum(int a,int b){
if (b == 0){
return a;
}
int sum = a ^ b;
int carry = (a & b) << 1;
return sum(sum,carry);
}
}
//循环实现
public class Solution02 {
int sum(int a,int b){
int sum = 0,carry = 0;
while (b!=0){
sum = a^b;
carry = (a&b)<<1;
a = sum;
b = carry;
}
return a;
}
}
标签:public 代码 结果 思路 运算 就是 pre 相加 sum
原文地址:https://www.cnblogs.com/xiaohuia/p/12964555.html