不用加号的加法

力扣中不用加号的加法:面试题17.01

问题:设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。

代码实现

class Solution {
  public int add(int a, int b) {
    while((a&b)!=0){//这两数的字节码相加是否会产生进位
      int temp=a;
      a=(a&b)<<1;//对会产生进位的位置进行进位
      b=(b^temp);//当a+b不进位时,运算
   }
    return a^b;//将最终不在会产生进位的两数相加
  }
}

解释:两数相加时,其二进制中相对应的每一位值的运算有以下几种可能:

a 0 0 1 1
b 0 1 0 1
+ 0 1 1 10

如图可知:当两数的相同位不全为1时,可使用^进行计算;当两数的相同位都是1时,将产生进位。

计算步骤:

  1. 循环判断 a&b是否等于零(判断是否会产生进位)
  2. 由于a在接下来的运算中将被改变,故使用临时变量temp存储a的值
  3. a=( a&b)<<1;(将两数相加会产生进位的数进行进位并赋予a)
  4. b=b^temp;(两数进行不进位的加法运算并将值赋给b)
  5. 重复步骤(1-4)
  6. 直至a,b进行加法运算时不再产生进位,退出循环
  7. 此时的a,b进行加法运算时,不会产生进位,res=a^b;

posted on 2021-05-11 19:47  凡人精灵  阅读(82)  评论(0编辑  收藏  举报

导航