日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
有C語言程序員說,使用移位操作代替乘除運(yùn)算效率更高,真的嗎?

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

創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的撫州網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

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

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

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

 
 
 
 
  1. unsigned int hash( char const* s )
  2. {
  3.  unsigned h = 0;
  4.  while ( *s != '\0' ) {
  5.  h = 127 * h + (unsigned char)*s;
  6.  ++ s;
  7.  }
  8.  return h;
  9. }

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

 
 
 
 
  1. unsigned int hash( char const* s )
  2. {
  3.  unsigned h = 0;
  4.  while ( *s != '\0' ) {
  5.  h = (h << 7) - h + (unsigned char)*s;
  6.  ++ s;
  7.  }
  8.  return h;
  9. }

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

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

解析

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

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

當(dāng)硬件不支持快速乘除法時(shí),編譯器會(huì)將乘除法轉(zhuǎn)換為移位和加法/減法的適當(dāng)組合。因?yàn)樗牢覀兊淖罱K目的,所以有時(shí)候顯示的寫出移位代碼,倒不如直接告訴編譯器我們的目的,這樣才能得到盡可能快的C語言程序。

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

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

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

小結(jié)

本節(jié)討論了C語言程序開發(fā)中,移位操作與乘除法操作的關(guān)系,并討論了它們之間的效率問題??梢钥闯觯覀儾⒉恍枰m結(jié)二者之間的取舍。事實(shí)上,考慮到代碼的易讀性和編譯器的優(yōu)化特性,我們應(yīng)該寫出“本意”代碼,即:希望實(shí)現(xiàn)乘除操作時(shí),就寫出乘除代碼。希望實(shí)現(xiàn)移位操作時(shí),就寫出移位代碼。


標(biāo)題名稱:有C語言程序員說,使用移位操作代替乘除運(yùn)算效率更高,真的嗎?
文章網(wǎng)址:http://www.dlmjj.cn/article/ccoespi.html