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

Posted xyuanzi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何不用加法符号计算a+b 的值?相关的知识,希望对你有一定的参考价值。

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

a+b的值可以等价于a^b+(a&b)<<1,也就是a异或b的值加上a与b的值再左移一位。a异或b的值被叫做非进位求和,(a&b)<<1是求每位的进位。举个例子就明白为什么是这样了。
比如计算5+4,对于二进制而言,100+101=1001,产生了进位。那么,100^101=001,100&101=100,左移一位就是1000(你算出是100吗?这里要注意,左移必须在右边补0),所以,1000+001=1001,5+4正好是9.我是这么理解的。下面举个两位数的,原理是一样的。13+9,1101^1001=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);
   }
 };




以上是关于如何不用加法符号计算a+b 的值?的主要内容,如果未能解决你的问题,请参考以下文章

不用加减乘除做加法(剑指offer-48)

剑指offer系列——48.不用加减乘除做加法

不用加减乘除做加法

65. 不用加减乘除做加法

剑指offer48 不用加减乘除做加法

[LeetCode]剑指 Offer 65. 不用加减乘除做加法