当前位置:   article > 正文

371.不使用运算符 + 和 - ​​​​​​​计算两整数 ​​​​​​​a b ​​​​​​​之和

371.不使用运算符 + 和 - ​​​​​​​计算两整数 ​​​​​​​a b ​​​​​​​之和

不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

但这个代码只适用于两个数同为正数的情况下,一旦有数为负数时,左移操作就会报错,这时我们就需要先将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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/175663?site
推荐阅读
相关标签
  

闽ICP备14008679号