如何不用加法符号计算a+b 的值?

目前为止只有一种思路:位运算+递归小操作

a+b的值可以等价于a^b+(a&b)<<1,也就是a异或b的值加上a与b的值再左移一位。a异或b的值被叫做非进位求和,(a&b)<<1是求每位的进位。举个例子就明白为什么是这样了。
比如计算5+4,对于二进制而言,100+101=1001,产生了进位。那么,100101=001,100&101=100,左移一位就是1000(你算出是100吗?这里要注意,左移必须在右边补0),所以,1000+001=1001,5+4正好是9.我是这么理解的。下面举个两位数的,原理是一样的。13+9,11011001=0100,1101&1001=1001,左移一位就是10010,10010+0100=10110,正好是22.
但是上面还是出现了进位和非进位的和,但是不能用加法直接相加。这里用到了一个小技巧,递归操作。递归的终止条件是进位为0,返回非进位和。举个最简单的例子就行了,比如 2+3 ,进位是不是0,整个和是不是非进位和?
简单的代码:
'''

 class Solution {
  public:
     int add(int a, int b) {
    if(b==0)
        return a;
    int c=a^b;
    unsigned int d =((unsigned int)(a&b)<<1);
    return add(c, d);
   }
 };
学习让我快乐,工作让我快乐。学习和工作都是为了更好的生活!
原文地址:https://www.cnblogs.com/xyuanzi/p/13362092.html