隨筆十八 整數乘法

2021-06-07 07:23:28 字數 714 閱讀 2244

對於無符號和補碼乘法來說,乘法運算的位級表示都是一樣的。這表明機器可以用一種乘法指令來進行有符號和無符號整數的乘法。

在大多數機器上,整數乘法指令相當慢,需要 10 個或者更多的時鐘週期,然而其他整數運算(例如加法、減法、位級運算和移位)只需要 1 個時鐘週期。因此,編譯器使用了一項重要的優化,試著用移位和加法和減法運算的組合來代替乘以常數因子的乘法。

對於乙個任務,對於某個常數 k 的表示式 x * k 生成**。編譯器會將 k 的二進位制表示吧表達為一組 0 和 1 交替的序列:

[(0...0)(1...1)(0...0)...(1...1)]

考慮一組從位位置 n 到位位置 m 的連續的 1(n >= m)。可以只用下面兩種不同形式中的一種來計算這些位對乘積的影響:

形式a:(x << n) + (x << n - 1) + ... + (x << m)

形式b:(x << n + 1) - (x << m)

把每個這樣連續的 1 的結果加起來,不用做乘法,就能計算出 x * k。當然,選擇使用移位、加法和減法的組合,還是使用一條乘法指令,取決於這些指令的相對速度,而這些是與機器高度相關的。大多數編譯器只在需要少量移位、加法和減法就足夠的時候才使用這種優化。

對於位位置 n 為最高有效位的情況,b表示式簡單地變成了-(x << m)。要看清這一點,設字長為w, n = w - 1.形式b說要計算(x << w) - (x << m),但是將 x 向做移動 w 位會得到值 0。

大整數乘法

參考 http hi.baidu.com operationsystem blog item 6e45dd1af1acadf3ae51330b.html 在計算機中,長整型 long int 變數的範圍是 2147483648 至 2147483647,因此若用長整型變數做乘法運算,乘積最多不能超過...

大整數乘法

問題描述 by 計算機演算法設計與分析 王曉東 p17 通常,在分析乙個演算法的計算複雜性時,都將加法和乘法運算當作是基本運算來處理,即將執行一次加法或乘法運算所需的計算時間當作乙個僅取決於計算機硬體處理速度的常數。這個假定僅在計算機硬體能對參加運算的整數直接表示和處理時才是合理的。然而,在某些情況...

大整數乘法。

include using namespace std int multi int num1,int size1,int num2,int size2 int size size1 size2 int ret new int size int i 0 for i 0 iret i 0 for i 0...