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

版权声明: https://blog.csdn.net/weixin_39733262/article/details/82957275

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

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

   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,具体的证明容我稍后想想)

while(a*b)

{

temp = a^b;

b=a&b<<1;

a=temp;
}

return a;

大抵如上述,需要进制转换

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

PS:python可以

return sum(a+b)

天才

猜你喜欢

转载自blog.csdn.net/weixin_39733262/article/details/82957275