Cortex―M0單片機二-十進位整數轉換的快速算法

2021-01-07 電子產品世界

摘要:為了提高Cortex—M0系列單片機應用系統的二進位到十進位BCD碼整數轉換代碼的執行效率,採用除十求餘數法來實現。該快速算法的核心內容是通過高效的彙編語言來實現常數除法,無論在程序代碼的運行時間和存儲空間上,都遠勝於sprintf函數。
關鍵詞:Cortex-M0;單片機;二-十進位轉換BCD碼;常數除法;快速算法

引言
在單片機應用系統中,一般都需要高效快速地完成系統所需要的任務,並在任務完成後使系統進入睡眠或低功耗狀態,以便最大限度地節省系統功耗,增強系統的抗幹擾能力。因此,必須優化和提高系統中各個模塊的運算速度,以最大限度地壓縮軟體運行時間。許多單片機應用系統中都需要進行二進位整數轉換為十進位BCD碼的操作,以便實現系統信息的顯示。對於Cortex—M0系列單片機,由於其指令系統中沒有十進位調整指令和除法指令,使得一些文獻中提供的高效算法和技巧不再適用於這類單片機,從而造成上述轉換操作成為影響系統性能的重要因素,因此提高上述數制轉換速度對於提高系統運行效率有極大的促進作用。

1 傳統的實現方法
要實現快速運算,很自然地想到經典的雙字節二進位整數轉換成3位元組BCD碼整數的子程序。其採用的算法是預先將一個3位元組隊列的內容清除為0,然後依次將需要變換成BCD碼的二進位整數的每位依次左移至CY位,再把3位元組隊列中的數據帶進位自身相加,並對相加的結果進行十進位調整。通過16次移位完成運算,結果為壓縮格式的3位元組BCD編碼。由於ARM指令系統中沒有類似於MCS-51單片機系統中的十進位調整指令,所以在Cortex—M0系列單片機上實現該算法比較困難。

2 快速算法概述
本快速算法採用除十求餘數法來實現。設需要轉換的數據也就是被除數為W,除數為10,整數除法的商為S,除法運算的餘數為R,根據數學運算規則有:
S=W/10 (1)
R=W-S×10=W-(W/10)×10 (2)
經過上述的運算,所得餘數R就是從被除數中分離出來的個位數字,也就是首先得到了被除數的最低位的BCD碼。為了獲取被除數其他位的BCD碼,只需要將上面得到的商S作為新的被除數W,然後重複執行上述整數除法運算,就可以分別得到被除數其他位上的BCD碼,從而完成將二進位數轉換為BCD碼的操作。實現上述操作的關鍵在於如何快速地完成除數為10的快速除法任務。

3 除法運算的實現
為了將被除數除以10,可以將其轉化為將被除數乘以0.1來實現,為此可以先寫出十進位數據0.1所對應的二進位小數的表示形式:
(0.1)D=0.000 1100 1100 1100 1100 1100 1100 1100 1100 1100……
為方便32位單片機進行整數運算,預先將上式中的二進位數左移35位,即將其擴大235倍後得到除數10的魔術數(Magic_Number)為:
Magic_Number=CCCCCCCDH(十六進位數)當得到除數10的魔術數後,將被除數與該魔術數相乘,然後將所得的乘積右移35位,即將乘積縮小235倍後得到最終的數據就是所期望的除法結果。
由於Cortex—M0系列單片機的乘法指令只能保留兩個32位數相乘後的乘積的低32位,乘積的高32位被捨棄,所以不能直接採用被除數與除數的魔術數相乘的方法來實現將除法轉換為乘法的運算。好在這個魔術數很有特點,可以將其表示為:
Magic_Number=C0000000H+0C000000H+0CC0000H+0CCCCH (3)
由於是通過求餘數的方法來獲取原始數據的各位BCD碼,所以在不損失運算精度的原則下,捨棄了原魔術數Magic_Number的最低位,但這不妨礙最後通過式(2)來求餘數的操作。下面就是對式(1)中的除10操作變換為乘法操作的具體實現方法:

通過(4)式,採用Cortex—M0系列單片機指令中的移位指令和加減法指令的組合運算就可以快速地得到整數除法的商S,進而採用式(2)來求餘數R。

51單片機相關文章:51單片機教程

單片機相關文章:單片機教程

單片機相關文章:單片機視頻教程

單片機相關文章:單片機工作原理


相關焦點

  • 單片機進位轉換
    今天我就給大家講講與計算機有關的「進位轉換」問題。   我們以(25.625)(十)為例講解一下進位之間的轉化問題。 1. 十 > 二  給你一個十進位,比如:6,如果將它轉換成二進位數呢?二 ----> 十  二進位數轉換為十進位數   二進位數第0位的權值是2的0次方,第1位的權值是2的1次方……   所以,設有一個二進位數:0110 0100,轉換為10進位為:
  • 關於二進位、十進位、八進位、十六進位數據轉換計算方法詳細總結
    一、 十進位與二進位之間的轉換(1) 十進位轉換為二進位,分為整數部分和小數部分 ① 整數部分 方法:除2取餘法,即每次將整數部分除以2,餘數為該位權上的數,而商繼續除以2,餘數又為上一個位權上的數,這個步驟一直持續下去,直到商為0為止,最後讀數時候,從最後一個餘數讀起,一直到最前面的一個餘數。
  • 二進位、十進位、八進位、十六進位間的相互轉換函數
    二進位、十進位、八進位、十六進位間的相互轉換函數1、輸入任意一個十進位的整數,將其分別轉換為二進位、八進位、十六進位。{int num;char a[39];//定義一個字符數組,用於存儲字符串cout<<"Entre num:"<<endl;cin>>num;cout<<"二進位
  • 前端學習隨筆14 利用js實現十進位與二進位相互轉換
    然後我們看一下相互轉換需要用到的方法,以下面代碼為例// 十進位轉換成二進位(八進位或十六進位)var num = 111;num.toString(2); //轉換成二進位num.toString(8); //轉換成八進位num.toString(16); //轉換成十六進位//二進位(八進位或十六進位)轉換成十進位var num1 = "111";parseInt(num1,2
  • 十進位和二進位之間的轉換
    既然一個數可以用二進位和十進位兩種不同形式來表示,那麼兩著之間就必然有一定的轉換關係。  由十進位數的一般表示式:  解:該題的解題思想是,不斷地用2分解十進位整數,並將餘數按得到的順序由低位到高位排列,即可得到對應的二進位數。
  • 二進位轉換為十進位和十進位轉換為二進位的方法
    各位小夥伴們大家好,在之前的文章中小編也介紹了關於二進位轉十進位的方法,這次小編知道了一個更簡單的方法,具體如下:比如我們要把28轉為二進位:28的二進位了。那我們把11100轉換為10進位:11100轉十進位還是從左到右,第一個數字1後面有4個數字,那麼就是2的4次方,之後一次類推知道2的0次方,再用相對應的次方乘以相對應的二進位數字就可以了,所以11100得到的十進位數字就是
  • 一大波 Excel 進位轉換函數來襲,二、八、十、十六進位互轉
    二進位轉其他:將二進位數轉換為八進位數:BIN2OCT 函數將二進位數轉換為十進位數:BIN2DEC 函數將二進位數轉換為十六進位數:BIN2HEX 函數八進位轉其他:將八進位數轉換為二進位數:OCT2BIN 函數將八進位數轉換為十進位數:OCT2DEC 函數
  • 先聊算盤,再聊二進位
    要明白二進位,首先不妨試試它的計數規則! 當然二進位的乘除運算是如何進行的,則充滿了數學的奧秘與人類大腦精彩完美的推理。二進位是世界上第一臺計算機上用的算法,最古老的計算機裡有一個個燈泡,當運算的時候,比如要表達「一」,第一個燈泡會亮起來。
  • 計算機基礎,二進位與十進位的轉換和示例!
    3、示例代碼 #include "stdio.h" #include // 把十進位整數轉換為二進位的字符串。 // dec:待轉換的十進位整數。
  • 清晰說明十進位如何快速轉二進位,助力考生
    關於二進位、十進位、八進位、十六進位數據轉換計算方法詳細總結>今天之所以又寫這篇文章,一是補充上文中的缺憾,沒有分享十進位到二進位最快的方法;再就是響應平臺號召,助力高考。我想這可能會是一個趨勢,現在的編程教育不斷向前提,所以不好說,而且小編在某處看到這樣一句話:【高考】考綱二 數值的概念、二進位整數、十進位整數和十六進位整數的相互轉算也算是一個偏門的預測了吧,何況,進位的轉換在我們日常的編程中也經常會用到,對於十進位到二進位的轉換更多的是在初級的考試中。掌握了今天的方法,可謂兩個字吧,快!準!
  • EV3關於10進位轉換2進位的詳解
    哈咯各位大家好之前突發奇想想做一個關於十進位轉化成二進位的想法,在這裡給大家講解一下。關於數字有多進位的,十進位、二進位、三進位、八進位、十六進位....等等。對我們最熟悉的莫過於十進位和二進位了,接下來給大家講解下如何實現將十進位轉化為二進位。【1】十進位我們最熟悉,我在這裡不多做解釋,只說十進位怎麼運算,例如302,可以看成從右往左以索引倒敘分別從0開始,進行注釋。
  • scratch+程小奔機器人實現「進位轉換」(十進位轉二進位)
    進位轉換圖【原創】文章全部內容皆為作者原創,如有轉載請註明出處我們人類有十根手指,通常情況下我們在生活中的計數方式為「十進位」(即0-9),也就說滿十進一;而在計算機的世界裡,基礎電路只有「開/關(通/斷)」(即0/1)兩種情況,這與誕生幾千年的二進位不謀而合;例如:二進位數字110,表達的就是十進位中的6;二進位數字1111,表達的就是十進位中的15。
  • 吳國平:除了十進位, 人類文明史上還有哪些進位算法?
    當我們看到像1、25、356……這些耳熟能詳的數字,大家都知道這是學習數學的基礎,代表全世界通用的十進位,即滿十進一,滿二十進二,以此類推。世界通用的十進位,對於現代文明的我們看來是那麼地熟悉自然。在人類文明進程過程中,算法並不是就只有十進位一種,在很多文明體系中出現各種各樣的算法,如二進位、二十進位等等。
  • 跟我學解Python題-二進位轉換
    實現:輸入十進位正整數,輸出相應的二進位數字輸入樣例1:6輸出樣例1:110輸入樣例2:27輸出樣例2:11011解題過程:1、新建變量num,用於存儲輸入的十進位數字,num=int(input("請輸入想要轉換的十進位數字(十轉二)"))
  • Day7 進位的表示與轉換
    這節課的內容太簡單了……學習進位的轉換。在計算機中,我們常用的進位有4種。一、二進位(Binary)在二進位裡,只有 0 和 1,二進位的運算遵循逢二進一。在 python 中要輸入一個二進位數,你不能直接輸入。比如我輸入一個 666 看看。很明顯這是個十進位。
  • 編輯器、進位與進位轉化
    2(4-1)位5的權:16 1*2(5-1)位6的權:32 1*2(6-1)位7的權:64 1*2(7-1)位8的權:128 1*2(8-1)進位的轉換1、非十進位轉換為十進位方法:按權展開 任何一種進位都可以表示成
  • 西門子PLC讀取的儀表數據(浮點數)如何轉換為整數
    看到一個網友的問題,西門子200PLC採用MODBUS RTU協議採集多功能儀表的數據,接收的數據均是32位的單精度浮點數,我怎麼在PLC程序裡面實現單精度浮點數與十進位之間的轉換?且問題的配圖如下:在計算器中先研究一下數據這是我電腦win10系統中的計算器切換到程式設計師模式,可以看到16進位的450F 9000轉換為十進位數是1158647808,和你的2297是不一樣的!
  • 2019福建教師招聘考試:信息技術 進位轉換
    二、不同進位之間的轉換(一)R進位轉換為十進位數R進位轉換為十進位數,只要將各位數字乘以各自的位權求和即可。(1101)2=1×23+1×22+0×21+1×20=13(732)8=7×82+3×81+2×80=474(1F04)16=1×163+15×162+0×161+4×160=7940(二)十進位轉換為R進位數轉換規則:整數部分(倒讀法):「逐次除以基數取餘」法,直到商為0;十進位轉換二進位:(15)10轉換成二進位數。
  • javascript進位的轉換
    大家都知道計算機在電腦上存儲的數據是01二進位數存儲的,但是二進位的這種數據對於我們人來說讀取是非常費勁的。這時候就需要我們用到二、八、十、十六進位之間的轉換了十進位和二進位之間的轉換十轉二:用到的方法是除二取餘,倒序排列例如將52轉為二進位結果為110100
  • 教師招聘考試信息技術學科—進位轉換知識點匯總
    二、不同進位之間的轉換(一)R進位轉換為十進位數R進位轉換為十進位數,只要將各位數字乘以各自的位權求和即可。轉換規則:採用R進位數的位權展開法,即將R進位數按「位權」展開形成多項式並求和,得到的結果就是轉換結果。