中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

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

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

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

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

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

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

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

讀者應將注意力放在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語言中使用移位操作代替乘除運算效率會更高嗎

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

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

解析

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

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

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

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

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

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

盘山县| 沁水县| 平凉市| 新巴尔虎右旗| 开原市| 丁青县| 西平县| 泰宁县| 天镇县| 湖北省| 铁岭县| 武陟县| 精河县| 鄂尔多斯市| 江孜县| 台南县| 五原县| 博爱县| 邓州市| 钟祥市| 郸城县| 江北区| 通江县| 喜德县| 商城县| 吉安县| 连云港市| 淄博市| 浠水县| 微山县| 抚松县| 巴林左旗| 阿勒泰市| 镇雄县| 武川县| 新津县| 德清县| 莎车县| 界首市| 青铜峡市| 威海市|