赞
踩
不使用运算符 + 和 - ,计算两整数 a 、b 之和。
示例 1:
输入: a = 1, b = 2;输出: 3
示例 2:输入: a = -2, b = 3;输出: 1
这里因为是求和,我们将整个过程分为两步来看:按位相加,如果两者相同位置都为1,向前进位,第一步我们可以使a^b,使得相加但不显示进位:
3^5就是0011^0101得到0110恰好是这两个数相加后不需要进位的那些二进制位,第二步我们让a&b将需要进位的找出来,然后再左移1位,这样就是进位后的值,再和第一部的结果按位异或,重复此过程直到第二步不需要进位为止;这样就得到了和:
int getSum(int a, int b) {
int sum,carry;
do{
sum =a^b;
carry = (a&b)<<1;
a = sum;
b = carry;
}while(b!=0);
return sum;
}
但这个代码只适用于两个数同为正数的情况下,一旦有数为负数时,左移操作就会报错,这时我们就需要先将ab强制类型转换成unsigned int 进行运算,然后返回时再强制类型转换成int:
int getSum(int a, int b) {
if(a==0){return b;}
if(b==0){return a;}
unsigned int _a = (unsigned int)a;
unsigned int _b = (unsigned int)b;
unsigned int sum;
while(_b){
sum = _a^_b;
_b = (_a&_b)<<1;
_a = sum;
}
return (int)sum;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。