簡體   English   中英

僅使用32位整數的算術運算

[英]Arithmetic Operations using only 32 bit integers

您如何在只能乘以32位數字的微處理器上計算兩個1024位數字的乘積?

出發點是要意識到您已經知道如何執行此操作:在小學時,我們曾教過如何對一位數字進行算術運算,然后提供了表示較大數字(例如小數)的數據結構和計算算術運算的算法(例如長除法)。

如果您有辦法將兩個32位數字相乘以得出64位結果(請注意, unsigned long long保證至少為64位),那么您可以使用這些相同的算法以2 ^ 32為基數進行算術。

您還需要例如帶有進位運算的加法。 您可以通過檢測溢出來確定兩個相同類型的無符號數字相加時的進位,例如:

uint32_t x, y; // set to some value
uint32_t sum = x + y;
uint32_t carry = (sum < x);

(從技術上講,這種操作要求您執行無符號算術:有符號算術中的溢出是未定義的行為,優化器會對您最不希望的代碼執行令人驚訝的事情)

(現代處理器通常提供一種將兩個64位數字相乘以得出128位結果的方法,但是要訪問它,您將必須使用諸如128位類型的編譯器擴展,否則您將不得不編寫內聯匯編代碼。現代處理器還具有專門的隨身攜帶說明)

現在, 有效地進行算術是一項巨大的工程。 我發現瀏覽文檔和源代碼到gmp (GNU多精度算術庫)非常有啟發性。

  1. 看看bigint操作的任何實現

  2. 使用32位算術作為64/128/256 / ...位算術的模塊

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM