当第一次面对这个问题的时候,我想到应该是用位运算。计算机的基本电路可以实现所有基本运算。
首先,加法应该如何运算?
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)
天才