色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

使用移位操作代替乘除運算

錢艷冰2年前15瀏覽0評論

使用移位操作代替乘除運算?

先簡單小結一下:

當編譯器優化能力很弱時,用移位代替簡單除法(除2,4,8,16...)效率更高;

當編譯器優化能力很弱時,在低端CPU上,用移位代替簡單乘法(乘2,4,8,16...)效率更高

其它情況下,在C語言程序中,用移位操作代替乘除運算沒什么效果,反而降低了代碼的可讀性

下面簡單說一下各種情況:

編譯器因素

現代C編譯器對于簡單的2,4,8之類的乘除法,會在優化時根據條件自動轉換成移位運算。這時,沒有必要手動使用移位操作符代替乘除,相信編譯器的優化能力就好了。有時候為了更好的適配目標CPU,可以給編譯器提供詳細參數,如ARM C編譯器可指定乘法指令所需周期數,這就方便編譯器針對特定CPU進行優化。

除法

當編譯器不能進行自動移位優化時,對于簡單除法,使用移位操作代替會有一定效果:由于除法的算法特性,RISC CPU(如ARM系列絕大多數CPU)都沒有完整的整數除法指令,這是基于除法特殊性造成的。如果用浮點數除法模擬,則結果未必正確,同時起碼需要十幾個時鐘周期才能完成。這時,如果能用兩三次移位操作和加法組合完成除法,當然會有效率的提高。

再說說CPU的影響:

低端CPU

這里提到的低端CPU,指的是沒有硬件乘法器、也沒有浮點協處理器的CPU。這類CPU的乘法需要用加法模擬,因此速度較慢。此時,用移位操作代替簡單的乘法能提高效率。

低端CPU舉例:無MAC單元的ARM Cortex-M系列CPU,AVR的Atmega等各8位MCU。

中高端CPU

中高端CPU通常都有乘法器和浮點協處理器。對于這類CPU,用移位代替乘法意義不大,也許能在CPU指令發射時降低流水線阻塞(這是由于多發射高端CPU的移位處理單元數量多于乘法器數量),從而提高微量的性能,但總體影響微乎其微。

java 移位運算符,使用移位操作代替乘除運算