码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-07-22 20:05:54      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:==   出现   pre   条件   技巧   turn   public   相加   代码   

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

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 的值?

标签:==   出现   pre   条件   技巧   turn   public   相加   代码   

原文地址:https://www.cnblogs.com/xyuanzi/p/13362092.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!