程式語言中的取余是如何實現的

時間 2021-05-31 10:31:18

1樓:

各種語言裡面的演算法不完全一樣。

有的語言支援任意精度整數,難道它也用跟C同樣的演算法計算餘數?另外各種語言裡面關於負數的處理也不一樣。

對於除數固定(編譯時已知)的取餘操作,編譯器完全可以把它優化掉,具體優化成什麼,你隨便拿個C編譯器試試就知道了。

特別對於Hash表這種,使用2的整數冪大小還是比較常見的,取餘當然可以直接用位操作替代。

用取餘的地方不多。比較常見的,可能有一些指派任務的演算法,可能會用乙個大的計數器不停地自增,然後用取餘數操作分配任務。

另外,如果本身就在做一些數學性很強的操作,那如果具體的數學模型要求你取餘數,你也沒有什麼道理不取。

另外,我不太同意題主說的除數很大,耗時很久的說法。除數很小,取餘數就快了嗎?除非處理器對小除數做了特殊操作(比如內建一些查詢表),不然沒有道理小餘數計算很快。

倒不如說,如果除數很大,比被除數還大,那取餘反而快呀。

2樓:風不停息

計算機中的取餘,取模,本質上是除法運算,得到商的同時也會得到餘數,沒有所謂的演算法之說。

如果要說演算法,從數學上將,CPU中的ALU在算術上只幹了兩件事,加法,移位,頂多加上取反,在邏輯上,只有與或非異或。

加法->加法。

減法->取反,加法。

乘法->移位,邏輯判斷,累加

除法->移位,邏輯判斷,累減

至於乘法除法為什麼這樣,搜尋二進位制數如何進行乘法除法,說白了,和我們熟悉的十進位制運算流程上一模一樣。

所以只需要加法器,移位器和基本邏輯閘電路就構成乙個簡單的ALU。

從硬體實現上講,可以看出,實現這四種基本運算只需要上述硬體元件就行。早期的cpu裡結構簡單,只有這些元件,沒有專門的乘法器、除法器。但是可想而知效率也是低下的(其中除法效率最低,因為每次移位後比乘法還多出一次試錯操作),後來的cpu會整合專門的並行處理電路在cpu內建的協處理器(比如浮點運算器,很早的cpu是沒有專門計算浮點的電路的)中,在硬體上實現,這樣計算速度就快了。

當然,計算的邏輯還是沒變。

另外,正如前面回答者提到的,當運算元為2的整數次冪時,乘法除法簡化為位移,幾乎沒有計算量,所以很多相應的設計就取2的整數次冪。

3樓:Andy Denker

Intel一條除法指令時間差不多是乘法指令的七八倍。

我記得32位和64位乘法指令都是三四個週期,32位除法指令要二三十個週期,64位更慢。

顯然乘法指令用專門的乘法電路直接算出結果,除法指令就是笨辦法試商算出來的。

除以常量,一般都不執行除法指令,而是乘以它的倒數,浮點除法都這麼做。整數除法,基本思路一致,則是乘以除數的倒數的2的32次方倍來實現的。具體就是乙個乘法,乙個移位,就得到商。

乘法的被乘數已經算好了的。

取餘的運算是乘法-移位求出商,然後乘法-減法求出餘數。加減法一般1個週期,加起來不到10個週期,比除法指令快很多。

除以變數沒辦法。它的倒數不可能實現算好。只能老老實實執行除法指令

4樓:

80x86彙編裡面除法指令div(idiv).

8位運算結果,商放在累加器低位AL,餘數放在累加器高位AH。

16位運算,商存放在累加器AX,餘數放在資料暫存器DX裡。and so on。

底層運算裡,餘數和商是同時算出來的。

計算餘數不是乙個單獨的功能。

這是硬體邏輯的工作。

補:彙編的除法本質是重複的減法

減到最後被除數不夠除數減了,剩下的自然就是餘數具體的步驟可以看這篇文章

彙編除法原理

計算機一次也就只能處理32/64位二進位制數運算。

除數大了要將計算拆分,當然會慢。

」如果除數非常非常大, 會不會導致計算的速度也非常慢呢?「

我想是的。

取餘數在密碼學理論上使用極為普遍。

實際這些功能多數直接由硬體電路實現,非常快。

5樓:馮東

取餘操作如果除數是 2 的整數次冪可以優化為移位操作。所以常用的取餘(比如 hashtable)都必須令除數為 2 的整數次冪。否則確實會有嚴重影響。

6樓:潘曉

我想瞎說下。

圖靈機原型中只有兩種操作:

1,改變當前位置0和1的狀態;

2,將指標從乙個位置移到另乙個位置。

所以我認為,在計算機中,取餘數是比除法更基本的操作。a%b,即指標從a的起始每次移動b個單位直至剩餘。

我猜的。

程式語言中內建型別是怎麼實現的?

Yunfei Lu 都有。一種語言,首先有基本型別,其實就是資料在記憶體的布局,方便表示不同種類的資料,例如整型和浮點是一定要有的,因為cpu的規範。再組合得到陣列,函式型別等,再發展出代數型別,然後包裝成介面 類 泛型等高階概念。基本型別在編譯器裡規定。至於標準庫中定義的型別,通常是某種組合的封裝...

程式語言中的 關鍵字 是怎麼實現的?自己該怎樣實現乙個關鍵字呢?

關鍵字本身是沒有功能的,要關聯功能,有不同的方式 對應到語法樹結構上 對應到一條或多條IR上 或者也可以直接對應到一條或一組彙編指令上 直接對應的到彙編一步到位的方式開發比較困難,除非你的語言相當簡單 關鍵字除了助記,乙個隱含的意義就是,在當前的語言環境下,其功能不可分割,它的分割在實現層。if 有...

為什麼負數的取餘計算各個程式語言結果不統一?

譚耀程 問題的關鍵在於商是向負無窮取值還是向0取值 7 10 0.7 or 7 10 1.3 其他語言我不清楚,貌似c11規定向0取值 就算是相同語言不同編譯器也會不一樣的。在我發現這個問題之後,每當我更新IDE 編譯器的時候都會用我的測試程式跑一遍,看看是不是和上個版本有什麼不同。有的時候一些小改...