1. 程式人生 > >C/C++ 利用位運算優化整數乘法

C/C++ 利用位運算優化整數乘法

對於大多數計算機而言,整數乘法要比整數加法、減法、位運算慢,通常是一個量級的差別。在這個前提下,對整數乘法用加法、減法、位運算替代,通常可以提高效能。

自《深入理解計算機系統》

由於整數乘法比移位和加法的代價要大得多,許多C 語言編譯器試圖以移位、加法和減法的組合來消除很多整數乘以常數的情況。

例如,假設一個程式包含表示式x*14。利用等式14 =8+ 4 + 2,編譯器會將乘法重寫為(x<<3)+(x<<2)+(x<<1),實現了將一個乘法替換為三個
移位和兩個加法。無論x 是無符號的還是補碼,甚至當乘法會導致溢位時,兩個計算都會得到一樣的結果。(根據整數運算的屬性可以證明這一點。)

更好的方法是,編譯器還可以利用屬性14 = 16 - 2,將乘法重寫為(x<<4)-(x<<1),這時只需要兩個移位和一個減法