0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

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

C語言中如何使用查表提速

麥辣雞腿堡 ? 來源:軒哥談芯 ? 作者:Debug ? 2023-11-21 11:19 ? 次閱讀

使用查表提速

一個資深的C語言程序員,基本上不會在自己的主循環(huán)里搞什么復(fù)雜的運算工作,絕對都是先計算好了,再到循環(huán)里查表。看下面的例子:

舊代碼:

long factorial(int i)
{
    if (i == 0)
      return 1;
    else
      return i * factorial(i - 1);
}

查表法新代碼:

static long factorial_table[] = {1, 1, 2, 6, 24, 120, 720  /* etc */ };
long factorial(int i)
{
    return factorial_table[i];
}

如果需要建立的表很大,那么可以通過一個初始化函數(shù),在循環(huán)外臨時生成表格。

看一個求余運算

a=a%8;

如果改為:

a=a&7;

就會執(zhí)行速度變快,因為在處理器中,位操作只需一個指令周期即可完成,而大部分的C編譯器的“%”運算均是調(diào)用子程序來完成,代碼長、執(zhí)行速度慢。通常,只要求是求2n方的余數(shù),均可使用位操作的方法來代替。

求平方運算

一些偏軟件的工程師往往會寫成這樣:

a=pow(a, 2.0);

也許這樣兼容性更好,可以處理的數(shù)據(jù)類型更多,但對于嵌入式來說,效率更為重要。

軒哥曾經(jīng)排查過一個代碼就是如此,這里的pow()函數(shù)執(zhí)行速度慢不說,調(diào)用這個函數(shù)將會產(chǎn)生2K多的代碼,直接導(dǎo)致Flash所剩無幾。

對于定點運算,可以改為:

a=a*a;

在有內(nèi)置硬件乘法器的單片機中(如STM32),乘法運算比求平方運算快得多,因為浮點數(shù)的求平方是通過調(diào)用子程序來實現(xiàn)的,而自帶硬件乘法器的單片機中,乘法運算只需2個時鐘周期就可以完成。即使是在沒有內(nèi)置硬件乘法器的單片機中,乘法運算的子程序也要比平方運算的子程序代碼短,執(zhí)行速度快。

如果是求3次方,如:

a=pow(a,3.0);

更改為:

a=a*a*a;

效率的提升會非常明顯。

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

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134130
  • 程序
    +關(guān)注

    關(guān)注

    115

    文章

    3720

    瀏覽量

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

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67770
收藏 人收藏

    評論

    相關(guān)推薦

    C語言中宏定義的應(yīng)用

    C語言中,宏定義是一種預(yù)處理指令,用于在代碼中定義和使用常量、函數(shù)或代碼片段的替代。
    發(fā)表于 08-17 15:33 ?613次閱讀

    C語言中for循環(huán)的用法和應(yīng)用 C語言中for循環(huán)與while循環(huán)的區(qū)別

    C語言中的循環(huán)結(jié)構(gòu)時,for循環(huán)是最常用的一種。它允許重復(fù)執(zhí)行一段代碼,直到滿足特定條件為止。
    發(fā)表于 08-18 16:33 ?2477次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>for循環(huán)的用法和應(yīng)用 <b class='flag-5'>C</b><b class='flag-5'>語言中</b>for循環(huán)與while循環(huán)的區(qū)別

    C語言中基本數(shù)據(jù)類型、變量和常量的使用

    C語言中基本數(shù)據(jù)類型、變量和常量的使用
    發(fā)表于 08-18 16:42 ?1631次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>基本數(shù)據(jù)類型、變量和常量的使用

    C語言中結(jié)構(gòu)體能不能相加

    C語言中,結(jié)構(gòu)體能不能相加?
    的頭像 發(fā)表于 12-19 17:04 ?1075次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>結(jié)構(gòu)體能不能相加

    C語言中的坑有哪些?

    總結(jié)幾個C語言中的“坑”
    發(fā)表于 12-28 06:11

    C語言中指針的介紹非常詳細

    C語言中指針的介紹非常詳細 C語言中指針的介紹非常詳細
    發(fā)表于 12-25 10:39 ?57次下載

    C語言和匯編語言混合編程方法和C語言中斷處理方法

    C語言和匯編語言混合編程方法和C語言中斷處理方法,new
    發(fā)表于 01-06 14:36 ?36次下載

    C語言中的關(guān)鍵字

    C語言中的入門教程
    發(fā)表于 10-14 16:24 ?3次下載

    c語言中typedef的用法

    C語言是一門通用計算機編程語言,應(yīng)用廣泛。C語言的設(shè)計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產(chǎn)生少量的機器碼以及不需要任何運行環(huán)
    發(fā)表于 11-09 15:23 ?9106次閱讀

    C語言中隨機數(shù)的生成代碼

    C語言中隨機數(shù)的生成完整代碼:
    的頭像 發(fā)表于 02-20 09:21 ?1w次閱讀

    總結(jié)那么幾個C語言中的“坑”

    總結(jié)幾個C語言中的“坑”
    的頭像 發(fā)表于 01-16 10:52 ?2479次閱讀

    C語言應(yīng)用】使用查表法計算CRC8

    C語言應(yīng)用】使用查表法計算CRC8
    的頭像 發(fā)表于 08-31 12:54 ?9475次閱讀

    c#語言中怎么使用HTTP代理

    c#語言中怎么使用HTTP代理。
    的頭像 發(fā)表于 09-01 14:46 ?1990次閱讀

    scanf在C語言中的作用

    scanf在C語言中的作用? scanf是C語言中的輸入函數(shù),用于從標準輸入設(shè)備(如鍵盤)讀取數(shù)據(jù),并將其存儲到變量中。它是C
    的頭像 發(fā)表于 11-23 14:13 ?991次閱讀

    c語言中數(shù)組怎么定義

    C語言中,數(shù)組是一種用來存儲相同類型元素的數(shù)據(jù)結(jié)構(gòu)。它可以存儲多個元素,并通過一個共同的名稱來引用這些元素。數(shù)組是一種很重要的數(shù)據(jù)結(jié)構(gòu),可以用于解決很多實際的問題。 在C語言中,定義數(shù)
    的頭像 發(fā)表于 11-24 10:11 ?2276次閱讀