如果世界之光有顏色,那麼一定是橙色
當第一次面對這個問題的時候,我想到應該是用位運算。計算機的基本電路可以實現所有基本運算。
首先,加法應該如何運算?
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)
天才