成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

有C語言程序員說,使用移位操作代替乘除運(yùn)算效率更高,真的嗎?

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

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

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

[[274659]]

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

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

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

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

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

 

有C語言程序員說,使用移位操作代替乘除運(yùn)算效率更高,真的嗎?

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

與前面那段C語言代碼相比,唯一的區(qū)別就是使用 h<<7 移位操作代替了 127 * h 乘法操作。在我的機(jī)器上,我測(cè)試了這兩段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í)候簡(jiǎn)單的移位操作并不等同于乘除法,而且有些乘法并不能通過簡(jiǎn)單的移位實(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)系,并討論了它們之間的效率問題。可以看出,我們并不需要糾結(jié)二者之間的取舍。事實(shí)上,考慮到代碼的易讀性和編譯器的優(yōu)化特性,我們應(yīng)該寫出“本意”代碼,即:希望實(shí)現(xiàn)乘除操作時(shí),就寫出乘除代碼。希望實(shí)現(xiàn)移位操作時(shí),就寫出移位代碼。

責(zé)任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2014-12-05 09:59:17

程序員

2010-01-14 13:24:49

CC++語言

2009-05-21 15:58:12

程序員工作經(jīng)驗(yàn)職場(chǎng)

2011-05-24 17:20:57

程序員

2010-12-20 09:26:44

SQL索引

2018-06-11 09:00:58

2018-10-10 15:52:48

程序員代碼編程

2013-04-18 09:55:05

程序員

2017-03-06 09:06:13

2013-04-08 15:39:15

程序員

2010-01-12 14:30:41

C++程序

2011-05-19 08:19:50

Lisp

2019-11-27 10:08:36

程序員技能開發(fā)者

2025-03-11 08:20:00

C++main函數(shù)

2014-07-14 11:28:41

2010-01-14 18:07:30

C++語言

2019-12-09 09:02:30

程序員行業(yè)能力

2014-06-26 09:59:45

程序員客戶

2019-07-25 07:42:35

程序員編程語言Python

2013-06-07 10:32:32

程序員職業(yè)生涯
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 综合精品在线 | 亚洲精品丝袜日韩 | 久久大香| 成人免费视频网站在线看 | 7777精品伊人久久精品影视 | 中文字幕在线网 | 国产精品综合色区在线观看 | 亚洲精品1区2区3区 91免费看片 | 国产欧美日韩精品一区二区三区 | 色伊人| a久久久久久 | 亚洲成人999 | 国产高潮av| 看片一区| 久久久国产精品 | 国产一区二区三区 | 久久久国产精品入口麻豆 | 中文字幕高清视频 | av在线一区二区三区 | 在线观看av网站 | 国产在线精品一区二区 | 国产日韩欧美91 | 国产1区在线| 啪啪免费网站 | 日韩欧美在线视频 | 中文字幕精品视频 | 免费观看的av | 国产在线观看一区二区三区 | 国产精品久久久久久久午夜 | 91精品国产一区二区三区 | 国产欧美在线 | 亚洲国产一区二区三区在线观看 | 99re在线视频 | 久久精品欧美电影 | 婷婷去俺也去 | 婷婷在线免费 | av福利网 | www.成人久久 | 国产一区二 | 欧美精品久久久 | 久久免费香蕉视频 |