快速嘗試。 有兩個32比特的無符號整數:AHI,ALO(分裂64 UINT)
uint32 ahi, alo;
void add_to_a(uint32 b) {
if (b==0) return; // adding 0 to a number does not change it
alo = alo+b; // alo should not be less than b now, so...
if (alo<b) ahi++; // check for carry (overflow)
// if carry, increment ahi
}
唯一棘手的部分,上方,是檢查是否有同時加入下部的進位。 CPU有一個內部機制來做到這一點,但在這裏我訴諸另一個想法。還要注意測試「if(b == 0)return」是相當多餘的,但它可以很方便。
一般來說,您可以設計其他運算符( - ,*,/),思考我們都學到了什麼。如果你知道如何手工操作,你可以用C語言翻譯,認爲我們打破數字的長數字。我們的思想使用的是從0到9的數字,C程序可以使用8位或16位或32的數字。上面的代碼片段是手動方法的直接轉換以添加兩個數字:我們從最後幾位開始到將它們總結起來,看看這個總和是否在一個數字中。如果是的話,我們記下這個數字,然後傳給下一個數字。否則,我們寫下餘數(「什麼適合數字」)並使用進位。上面的代碼片段甚至更簡單,因爲我們知道這兩個數字分別由2位數和1位組成。
可以使分區相同(複製「手動」方法),但必須使用一些位移位。或者,如果您不介意浪費時間,只需計算您可以從另一個數字中減去一個數字的次數。 :-)
'div()'不會像那樣工作。這是計算機算法中最複雜的功能。 – 0andriy
真的嗎? 你的意思是不會使用我所說的Add()方法嗎? –
它不會。如果您嘗試在32位平臺上將64位值除以32或64位值,則不會那麼簡單。 – 0andriy