> 2 ; 通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。用移位的方法得到代碼比調(diào)用乘除法子程序生成的代碼效率高。實(shí)際上,只要是乘以或除以一個(gè)整數(shù),均可以想辦法用移位的方法得到結(jié)果,如: a =a* 9 可以改為: a =(a 3 )+a 采用運(yùn)算量更小的表達(dá)式替換原來(lái)的表達(dá)式,下面是一個(gè)經(jīng)典例子: 原代碼: x = w % 8; y = pow(x, 2.0); z = y * 33; for (i = 0;i { h = 14 * i; printf("%d", h); } 修改為" />
0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言如何用移位來(lái)解決乘除法問(wèn)題

麥辣雞腿堡 ? 來(lái)源:軒哥談芯 ? 作者:Debug ? 2023-11-21 11:25 ? 次閱讀

用移位來(lái)解決乘除法問(wèn)題

a=a*4;
b=b/4;

可以改為:

a=a< 2;
b=b >>2;

通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。用移位的方法得到代碼比調(diào)用乘除法子程序生成的代碼效率高。實(shí)際上,只要是乘以或除以一個(gè)整數(shù),均可以想辦法用移位的方法得到結(jié)果,如:

a=a*9

可以改為:

a=(a< 3)+a

采用運(yùn)算量更小的表達(dá)式替換原來(lái)的表達(dá)式,下面是一個(gè)經(jīng)典例子:

原代碼:

x = w % 8;
y = pow(x, 2.0);
z = y * 33;
for (i = 0;i < MAX;i++)
{
    h = 14 * i;
    printf("%d", h);
}

修改為:

x = w & 7;                 /* 位操作比求余運(yùn)算快*/
y = x * x;                 /* 乘法比平方運(yùn)算快*/
z = (y < < 5) + y;          /* 位移乘法比乘法快 */
for (i = h = 0; i < MAX; i++)
{
    h += 14;               /* 加法比乘法快 */
    printf("%d",h);
}

如此,對(duì)比一下執(zhí)行時(shí)間會(huì)快很多。

學(xué)會(huì)避免不必要的整數(shù)除法

整數(shù)除法是整數(shù)運(yùn)算中最慢的,所以應(yīng)該盡可能避免。一種可能減少整數(shù)除法的地方是連除,這里除法可以由乘法代替。這個(gè)替換的副作用是有可能在算乘積時(shí)會(huì)溢出或者丟失精度,所以只能在一定范圍的除法中使用。

舉個(gè)例子,不好的代碼:

int i, j, k, m;
m = i / j / k;

推薦的代碼: 注意精度

int i, j, k, m;
m = i / (j * k);
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134041
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67765
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    乘除法運(yùn)算

    乘除法運(yùn)算本應(yīng)用例的目的在于提供乘、除運(yùn)算的函數(shù)及介紹乘除運(yùn)算在SPMC75F2413A中的使用。應(yīng)用例提供有符號(hào)和無(wú)符號(hào)數(shù)的乘除,其中包括32-Bit/16-Bit、16-Bit/8-Bit
    發(fā)表于 09-21 09:26

    單片機(jī)C語(yǔ)言易錯(cuò)知識(shí)點(diǎn),記住它們會(huì)讓你事半功倍

    是個(gè)不錯(cuò)的方法,筆者很喜歡拿到一段代碼后用移位代替乘除法來(lái)進(jìn)行優(yōu)化。不過(guò)有時(shí)候卻會(huì)出現(xiàn)問(wèn)題,比如溢出問(wèn)題。當(dāng)很明顯可能溢出的話我們是會(huì)注意的,比如但是有時(shí)候這個(gè)問(wèn)題是不明顯的,比如當(dāng)移位
    發(fā)表于 08-23 16:36

    C語(yǔ)言編程容易混淆的幾個(gè)問(wèn)題總結(jié)

    會(huì)出錯(cuò)3. 移位要防止溢出其實(shí)用移位代替乘除法是個(gè)不錯(cuò)的方法,筆者很喜歡拿到一段代碼后用移位代替乘除法來(lái)
    發(fā)表于 09-18 16:17

    單片機(jī)C語(yǔ)言易錯(cuò)

    、 !和 ~ 不一樣! 是邏輯非符號(hào),~ 是位取反符號(hào)。對(duì)IO口某個(gè)引腳賦值時(shí)不要錯(cuò)用 !如 2、的優(yōu)先級(jí)低于+、-比如要實(shí)現(xiàn)c=x*2+1,沒(méi)有加括號(hào)會(huì)出錯(cuò) 3、移位要防止溢出其實(shí)用移位代替
    發(fā)表于 11-15 11:41

    C語(yǔ)言編程容易混淆的幾個(gè)問(wèn)題總結(jié)

    加括號(hào)會(huì)出錯(cuò)3. 移位要防止溢出其實(shí)用移位代替乘除法是個(gè)不錯(cuò)的方法,筆者很喜歡拿到一段代碼后用移位代替乘除法
    發(fā)表于 08-23 17:24

    請(qǐng)問(wèn)單片機(jī)C語(yǔ)言容易出錯(cuò)是為什么?怎么解決?

    加括號(hào)會(huì)出錯(cuò)3移位要防止溢出其實(shí)用移位代替乘除法是個(gè)不錯(cuò)的方法,筆者很喜歡拿到一段代碼后用移位代替乘除法
    發(fā)表于 06-07 05:33

    淺析嵌入式C語(yǔ)言里的除法移位

    簡(jiǎn)單給大家分析一下嵌入式C語(yǔ)言編程時(shí)用到的除法移位?! ?b class='flag-5'>除法土豪  除法在嵌入式微處理器里可算
    發(fā)表于 04-30 00:31

    請(qǐng)問(wèn)一下C語(yǔ)言如何通過(guò)移位來(lái)實(shí)現(xiàn)算術(shù)乘除?

    請(qǐng)問(wèn)一下C語(yǔ)言如何通過(guò)移位來(lái)實(shí)現(xiàn)算術(shù)乘除
    發(fā)表于 10-19 06:48

    整數(shù)乘除法與位運(yùn)算的效率對(duì)比分析哪個(gè)好

    文章目錄01 - 為什么整數(shù)位移比乘除法高效02 - 位移和乘除法對(duì)比2.1 - 匯編代碼對(duì)比2.2 - 編寫復(fù)雜度對(duì)比2.3 - 速度對(duì)比03 - 例程3.1 - 例程1,單片機(jī)時(shí)鐘重載值3.1
    發(fā)表于 12-24 07:33

    RISC有沒(méi)有乘除法指令呢?

    RISC有沒(méi)有乘除法指令呢?
    發(fā)表于 02-27 13:59

    乘除法電路

    乘除法電路 圖5.4-21是乘除法運(yùn)算實(shí)用電路之一。 1、A
    發(fā)表于 04-26 16:11 ?1.7w次閱讀
    <b class='flag-5'>乘除法</b>電路

    按鍵移位程序【C語(yǔ)言版】

    按鍵移位程序【C語(yǔ)言版】按鍵移位程序【C語(yǔ)言版】按鍵移位
    發(fā)表于 12-29 11:04 ?0次下載

    關(guān)于如何提高C語(yǔ)言程序的執(zhí)行效率

    乘除法很消耗CPU資源,查看匯編代碼會(huì)發(fā)現(xiàn),一個(gè)乘除法運(yùn)算會(huì)編譯出10幾甚至幾10行代碼。如果是乘以或除以2的n次方,可以用>來(lái)實(shí)現(xiàn),這種移位運(yùn)算在編譯時(shí)就已經(jīng)算好了,所以代碼很簡(jiǎn)潔,
    的頭像 發(fā)表于 06-26 16:36 ?7490次閱讀

    匯編實(shí)現(xiàn)多字節(jié)乘除法

    匯編實(shí)現(xiàn)多字節(jié)乘除法乘法單片機(jī)的乘法本質(zhì)是二進(jìn)制的乘法,而乘法本身是通過(guò)加法實(shí)現(xiàn)的。多字節(jié)的乘法其實(shí)就是移位做加法。例如7x11,用二進(jìn)制豎式表示如下圖:可以看到,其實(shí)就是判斷乘數(shù)的每一位是1還是0
    發(fā)表于 11-15 17:21 ?21次下載
    匯編實(shí)現(xiàn)多字節(jié)<b class='flag-5'>乘除法</b>

    verilog移位操作和C語(yǔ)言移位操作的異同點(diǎn)有哪些?

    C語(yǔ)言移位操作和Verilog語(yǔ)言移位操作在某些方面具有相似之處,但也存在一些顯著的不同點(diǎn)。下面我們將通過(guò)代碼示例
    的頭像 發(fā)表于 08-28 09:43 ?685次閱讀