1. 程式人生 > >如果世界之光有顏色,那麼一定是橙色

如果世界之光有顏色,那麼一定是橙色

當第一次面對這個問題的時候,我想到應該是用位運算。計算機的基本電路可以實現所有基本運算。

首先,加法應該如何運算?

   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)

天才