高效的C編程之:除法運算

2021-01-12 電子產品世界

本文引用地址:http://www.eepw.com.cn/article/257023.htm

因為ARM體系結構本身並不包含除法運算硬體,所以在ARM上實現除法是十分耗時的。ARM指令集中沒有直接提供除法彙編指令,當代碼中出現除法運算時,ARM編譯器會調用C庫函數(有符合除法調用_rt_sdiv,無符合除法調用_rt_udiv),來實現除法操作。根據除數和被除數的不同,32bit的除法運算一般要佔有20-140個指令周期。除法運算佔用的指令周期,由下面公式計算。

Time(除數n/被除數d)

=C0+C1*log2(除數n/被除數d)=

=C0+C1*(log2(除數)-log2(被除數)).

為了避免在程序中出現除法操作,編程時儘量使用其他運算來代替除法操作。如,使用x>(z×y)來代替(x/y)>z。

另外,在無法避免的除法運算中,儘量使用無符合除法代替有符號除法。這是因為在ARM庫函數中,無符合除法的運算速度要快於有符合除法。

下面章節將詳細討論如何在代碼中提高除法運算的執行效率。

ARM的除法運算庫函數能同時返回運算的商和餘數。

在一些同時需要商和餘數的情況下,編譯器將調用一次除法運算函數同時存儲運算的商和餘數。

下面是一個編譯器調用除法庫,同時存儲運算的商和餘數的例子。

源程序如下。

intcombined_div_mod(inta,intb)

{

return(a/b)+(a%b);

}

下面是編譯器編譯出的彙編代碼。

combined_div_mod

STMDBsp!,{lr}

MOVa3,a2

MOVa2,a1

MOVa1,a3

BL__rt_sdiv

ADDa1,a1,a2

LDMIAsp!,{pc}

從上面的例子可以看出,調用一次除法運算,同時返回了商和餘數。

14.2.2使用2的整數次冪做除數

當2的整數次冪做除數時,編譯器會自動將除法運算轉換成移位運算。所以在編寫程序算法時,儘量使用2的整數次冪做除數。

下面的例子顯示了編譯器對除法運算的自動優化。

源程序如下。

typedefunsignedintuint;

uintdiv16u(uinta)

{returna/16;

}

intdiv16s(inta)

{returna/16;

}

編譯器的編譯結果如下。

div16u

MOVa1,a1,LSR#4

MOVpc,lr

div16s

CMPa1,#0

ADDLTa1,a1,#f

MOVa1,a1,ASR#4

MOVpc,lr

從上面的例子可以看出,無符號除法的運算速度快於有符號除法。


相關焦點

  • 連除法簡便運算小竅門
    連除法都可以從左往右依次計算,但這種方法往往計算起來很麻煩。像這道題用「除法的性質「就簡單多了。除法的性質:一個數連續除以幾個數,可以用這個數除以所有除數的積,商不變。用字母表示:a÷b÷c= a ÷(b×c)連除法除了用「除法的性質」計算比較簡便外,還可以倒數的知識,那就是除以一個數也就乘這個數的倒數,連除就變成連乘了。連乘的好處就是因數之間能約分的可以先約分再計算。根據上面的例題,用除法的性質計算一下這道題,感覺一下,是不是確實簡便。連除變成連乘,先約分,再計算。
  • 數學運算(三)——無符號數除法器
    數學運算(一)—— 無符號數加法器數學運算(二)——無符號數乘法器結構數學運算(三)——無符號數除法器
  • 除法的運算性質有哪些?
    但是減法的性質和除法的性質在運算當中不容易靈活準確運用。現在我們通過幾個例題來看一下除法有哪些運算性質。第一個例題很多同學說,跟乘法分配律長得很像。我們來看下:按照正常的運算順序:(44+36)÷4=80÷4=20如果拆括號的話變成:(44+36)÷4=44÷4+36÷4=11+9=20兩個數的和或者差除以同一個數,等於這兩個數分別去除以這個數,再相加。
  • 初中數學培優 七年級下 第七講 整式的除法(多項式除法)
    二、重點難點分析1.單項式除以單項式是整式除法的基礎,熟練掌握其運算法則是關鍵。2.同底數冪的除法要注意除式的底數不能為零,法則中的底數可以是一個數也可以是一個代數式。amn=am-n.3.零指數和負整數指數冪中的底數均不能為零。a0=1(a≠0);a-n=(a≠0).
  • 數學運算和它們的逆運算
    一級運算包括加法和減法。加法a+b=c,由此推出逆運算,減法c-a=b和減c-b=a。也可以把減法看做加法,即c+(-a)=b和c+(-b)=a。二級運算包括乘方和除法。乘方a×b=c,由此推出逆運算,除法c÷a=b和除法c÷b=a。也可以把除法看做乘法,即c×(1/a)=b和c×(1/b)=a。
  • Python自學筆記,編程中簡單的加減乘除
    日常生活中,我們都會有過很多的加減乘數的基本運算。今天我們來看看Python這麼程式語言,是怎麼進行簡單的基本運算的。的運算結果是沒有辦法保存的,如果我們要用運算的結果做運算只能從新將運算結果在手動輸入,是不是很麻煩。
  • 除法巧算有規律 性質方法要牢記
    在除法的巧算中,有一些規律和性質,如果能很好的掌握,計算就很簡便了。1、商不變的規律: 被除數和除數同時乘或除以相同的數(0除外),它們的商不變。一般有:(a+b)÷c=a÷c+b÷c(a-b)÷c=a÷c-b÷c比如: (350+335)÷5=350÷5+335÷5=70+67=1373、乘除同級運算可以抱著前面的符號「搬家」的性質。(1)兩個數的商除以一個數,等於商中的被除數先除以這個數,再除以原來商中的除數。
  • 初一數學,有理數除法法則,加減乘除混合運算不跳步,按步拿分
    有理數的除法和乘法類似,先確定符號,再計算。————小學知識回顧————1.除法運算(1)已知兩個因數的積與其中的一個因數,求另一個因數的運算叫除法。(2)除數是整數除法的法則:除數是整數的小數除法,按照整數除法的法則去除,商的小數點要和被除數小數點對齊,如果除到被除數的末尾仍有餘數,就在餘數後面添0再繼續除。(3)除數是小數的除法運算法則:除數是小數的除法,先移動除數小數點,使它變成整數;除數的小數點向右移幾位,被除數小數點也向右移幾位(位數不夠在被除數末尾用0補足)然後按照除數是整數的小數除法進行計算。
  • 使用跨導運算放大器的乘法器除法器
    使用跨導運算放大器的乘法器除法器
  • 加法和乘法有交換律,為什麼減法和除法沒有交換律
    在不改變結果的情況下,合理使用四則運算的規則,達到快速準確的目的是大家孜孜不倦的追求。當然前面的基礎運算能力一定要紮實,沒有堅實的基礎,後面的巧算猶如空中樓閣。四年級數學試卷,圖片來自網絡在小學四年級之前,數學運算基本上都是同級運算,也就是說一個算式中,只有加、減,或者加減混合運算;又或者是一個算式中只有乘法或除法,或者說乘除混合運算。我們把這兩種都歸為同級運算。
  • 四年級數學下冊《運算定律》單元小結,知識匯總
    要避免這些錯誤,同學們應熟記每一個運算定律,能熟練默寫出運算定律(用字母表示),下文中有所有運算定律匯總圖。《運算定律》是進行簡便計算的重要方法,五年級小數運算和六年級分數運算時都會用到「運算定律」來進行簡便計算。所以今天掌握的好壞直接影響著五、六年級的數學成績,同學們要重視。
  • 初中數學,同底數冪乘法和除法運算重要基礎題型匯總
    初中數學,同底數冪乘法和除法運算重要基礎題型匯總。考查內容:1、同底數冪乘法和除法公式的使用方法;2、底互為相反數的冪如何化為同底。02、同底數冪乘法的基礎運算:底數不變,指數相加即可,需要注意的是,單個字母的指數為1,不是0。03、同底數冪乘法公式使用的前提是:冪的底必須相同,即完全一樣,本組習題考查簡單的化同底的方法。04、同底數冪乘法提高運算,多個不同底的冪相乘和兩個不同底的冪相乘的解題思維一樣,都是先化同底,然後再使用公式。
  • 第27節:整除求商的運算
    而unsigned char ,unsigned int ,unsigned long這三種類型的除法都是整除,我後續所講的所有章節內容也都是整除。整除的通用格式:「保存變量」=「被除數」 / 「除數1」 / 「除數2」... / 「除數N」;跟之前講的加減運算一樣,左邊的「保存變量」必須是變量,右邊的可以是變量和常量的任意組合。
  • 小學數學中的運算定律
    小學數學中的運算定律包括:加法交換律、加法結合律、減法的性質、乘法交換律、乘法結合律、乘法分配律、除法的性質。這些運算定律在整數、小數、分數、百分數中都適用。其中乘法分配律又是這些運算定律裡面最重要的,也是學生掌握不牢固的。
  • MATLAB的矩陣運算與重構
    數組運算與矩陣運算在MATLAB中,術語矩陣和數組在一般情況下是沒有區別的。嚴格地說,一個矩陣就是一個二維的數組,是用來進行線性代數運算的。MATLAB運用於矩陣上的數學運算符是以線性代數中的矩陣運算法則來進行計算的,而數組運算是基於兩個矩陣對應元素之間的,所以在MATLAB中,數組運算和矩陣運算是有區別的。
  • 信息學競賽需要掌握哪些程式語言知識
    一、程式語言選擇信息學聯賽主要考的是程序設計,選擇合適的參賽程式語言是首要選擇,信息學競賽的程式語言有三種:pascal語言、c語言、c++語言,pascal語言將於2022年停止在信息學競賽中使用,所以現在學習pascal語言意義不大,剩下的只有選擇c語言和c++語言,實際考試中絕大多數考生選擇
  • go 學習筆記之學習函數式編程前不要忘了函數基礎
    所以接下來我們一邊複習一邊學習函數的基本特點,為接下來理解函數式編程打下基礎,關於函數的基礎語言可參考 go 學習筆記之值得特別關注的基礎語法有哪些函數的基礎語法和高級特性下面以最基本四則運算為例,貫穿全文講解函數的基本語法和高級特性
  • 2021初中七年級代數知識點:有理數的運算
    中考網整理了關於2021初中七年級代數知識點:有理數的運算,希望對同學們有所幫助,僅供參考。   有理數的運算   1.有理數的加法:   加法一般步驟:   ①確定符號:同號取相同的符號。   異號取絕對值大的加數的符號。
  • 《資料庫原理》知識點之關係代數運算
    2.2.1 關係代數的五個基本操作  考核要求:達到「簡單應用」  層次知識點:五個基本操作的含義和運算應用  (1)並(∪):兩個關係需有相同的關係模式,並的對象是元組,由兩個關系所有元組構成。
  • 輾轉相除法