zoukankan      html  css  js  c++  java
  • 如何不用加法符号计算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);
       }
     };
    学习让我快乐,工作让我快乐。学习和工作都是为了更好的生活!
  • 相关阅读:
    使用header发送状态代码
    apache rewrite模块基础知识
    Deprecated: Function set_magic_quotes_runtime() is deprecated
    Xmind3.3强烈推荐
    windows 下安装svn服务
    Zend Studio 8
    mysql触发器
    程序员每天该做的事(转载)
    你真的了解.NET中的String吗?
    VS2005中Build顺序的设定
  • 原文地址:https://www.cnblogs.com/xyuanzi/p/13362092.html
Copyright © 2011-2022 走看看