如何不用加号实现加法运算

当第一次面对这个问题的时候,我想到应该是用位运算。计算机的基本电路可以实现所有基本运算。

首先,加法应该如何运算?

   1 2 3

+ 7 8 9

------------

3+9 等于2进1

2+8 等于0进1 +上一位进的1

1+7等于8 +上一位进的1

所以可以看出,加法本身是进位和本位的结合。确切的说,是当前位的本位,加上当前位前面一位的进位的和。或者说,是所有进位进位左移,加上当前位本位的和.

 

那么如何计算当前本位的加和和进位的数值呢?显然用电路实现十进制非常复杂。我们先用二进制做例子。

   1 1 1 

+ 1 0 1

----------

1 1 0 0

这样通过异或操作和与操作就比较容易实现了。

 

XOR亦或操作

即“两个输入相同时为0,不同则为1”!

输入

运算符

输入

结果

1

0

1

1

1

0

0

0

0

0

1

1

这个就是本位加和。1+0和0+1都是1,1+1和0+0都是0.区别在于1+1是本位0,但是进位1.

 

AND逻辑与

两者都为1的时候为1,其余均为0 。

这个就是进位操作,只有1+1的时候才进行进位.

 

那么思路就出来了,将当前数字转化为二进制数字记为a,进行按位与运算,然后将其左移一位,然后上二进制数字a按位或运算的值.

然而上述加如何实现呢,方法是迭代.每次均会出现一个进位和一个本位和,在有限轮迭代之后其中一个数字会变成0.那么另一个数字就是加合结果了.(那么如何证明迭代之后一定会有一个数字为0呢,其实目前可以大概证明只要不是0+0的话,进位和本位必然不同,且不会循环.所以必然会收敛到0,具体的证明容我稍后想想)

 

    int Add(int num1, int num2)
    {

        while(num1&num2)
        {
          int temp = (num1&num2)<<1;
          num2=num1^num2;
          num1 = temp;
        }
        return num1|num2;

    }

大抵如上述

此题如果用python实现会出现问题,原因在于数字存储方式不同,进位可能会出现最高位的问题.

 

 

 

 

 

 

 

PS:python可以

return sum(a+b)

天才

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值