溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C語言中使用移位操作代替乘除運算效率會更高嗎

發(fā)布時間:2021-11-22 15:16:07 來源:億速云 閱讀:344 作者:iii 欄目:編程語言

本篇內(nèi)容介紹了“C語言中使用移位操作代替乘除運算效率會更高嗎”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

在C語言程序開發(fā)中,一些移位操作似乎可以達(dá)到與乘除法操作一樣的效果。例如,4>>1 等于 2,此時右移一位相當(dāng)于除以  2。類似的,2<<1 等于 4,此時左移一位相當(dāng)于乘以 2。

因此,有些教材推薦使用移位操作代替乘除操作,稱可以為最終的C語言程序帶來效率上的提升,那么真的如此嗎?

移位代替乘除,C語言程序效率更高嗎?

得到答案最簡單直接的方法是做實驗,下面是兩段關(guān)于哈希算法的C語言程序,請看:

unsigned int hash( char const* s ) {  unsigned h = 0;  while ( *s != '\0' ) {  h = 127 * h + (unsigned char)*s;  ++ s;  }  return h; }

讀者應(yīng)將注意力放在h = 127 * h + (unsigned  char)*s;一行,此時C語言代碼使用的是乘法操作。下面是另外一段C語言代碼,請看:

unsigned int hash( char const* s ) {  unsigned h = 0;  while ( *s != '\0' ) {  h = (h << 7) - h + (unsigned char)*s;  ++ s;  }  return h; }
C語言中使用移位操作代替乘除運算效率會更高嗎

唯一的區(qū)別就是使用 h<<7 移位操作代替了 127 * h 乘法操作

與前面那段C語言代碼相比,唯一的區(qū)別就是使用 h<<7 移位操作代替了 127 * h  乘法操作。在我的機器上,我測試了這兩段C語言代碼的效率,結(jié)果是兩者差不多快,有時 127 * h 版本的C語言代碼更快!

解析

C語言程序中,使用移位操作代替乘除操作更快嗎?現(xiàn)在這個問題我們已經(jīng)有答案了:并不如此。原因在于C語言編譯器一般都會優(yōu)化我們的代碼,它知道如何盡可能快地增加目標(biāo)處理器體系結(jié)構(gòu)的能力,也即盡量生成盡可能快的程序。

因此作為C語言程序員,我們應(yīng)該做的是明確告訴編譯器我們的意圖(即到底是 i * 2,還是  i<<1),讓它根據(jù)上下文決定如何產(chǎn)生更快的指令。

當(dāng)硬件不支持快速乘除法時,編譯器會將乘除法轉(zhuǎn)換為移位和加法/減法的適當(dāng)組合。因為它知道我們的最終目的,所以有時候顯示的寫出移位代碼,倒不如直接告訴編譯器我們的目的,這樣才能得到盡可能快的C語言程序。

事實上,有時候簡單的移位操作并不等同于乘除法,而且有些乘法并不能通過簡單的移位實現(xiàn),例如:

-5 / 2 = -2 -5 >> 1 = -3 i*3 = (i<<1) + i i*10 = (i<<3) + (i<<1)

因此,使用移位操作代替乘除法操作可能會帶來預(yù)計之外的結(jié)果。而且有些移位組合也會讓同事難以理解這段C語言代碼的真實意圖,也不利于協(xié)作開發(fā)和后期維護(hù)。

“C語言中使用移位操作代替乘除運算效率會更高嗎”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI