<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                【29.1 先余后商。】 求商求余除了數學運算外,在實際單片機項目中還有一個很常用的功能,就是提取某個數的個十百千位。提取這些位有什么用呢?用途可大了,幾乎凡是涉及界面顯示的項目都要用到,比如數碼管的顯示,液晶屏的顯示。提取某個數的個十百千位是什么意思呢?比如8562這個數,提取處理后,就可以得到千位的8,百位的5,十位的6,個位的2。這里提到的“個,十,百,千”位只是一個虛數,具體是多少應該根據實際項目而定,也有可能是“個,十,百,千,萬,十萬,百萬...”等位,總之,提取的思路和方法都是一致的。下面以8562這個數為例開始介紹提取的思路和方法。 第一步:先把8562拆分成8562,562,62,2這四個數。怎么拆分呢?用求余的算法。比如: 8562等于8562%10000; 562等于8562%1000; 62等于8562%100; 2等于8562%10; 第二步:再從8562,562,62,2這四個數中分別提取8,5,6,2這四個數。怎么提取呢?用求商的算法。比如: 8等于8562/1000; 5等于562/100; 6等于62/10; 2等于2/1; 第三步:最后,把第一步和第二步的處理思路連寫在一起如下: 8等于8562%10000/1000; 5等于8562%1000/100; 6等于8562%100/10; 2等于8562%10/1; 仔細觀察,上述處理思路的規律感特別清晰,我們很容易發現其中的規律和原因,如果要提取“萬,十萬,百萬...”的位數,也是用一樣的思路。另外,多說一句,根據我的經驗,有一些單片機的C編譯器可能不支持long類型數據的求余求商連寫在一起,那么就要分兩步走“先求余,再求商”,分開來操作。比如: unsigned char a; a=8562%10000/1000; //提取千位。 分成兩步走之后如下: unsigned char a; a=8562%10000; a=a/1000; //提取千位。 提取其它位分兩步走的思路也是一樣,不多說。 【29.2 先商后余。】 剛才講到了“先余后商”的提取思路,其實也可以倒過來“先商后余”,也就是先求商再求余數。下面還是以8562這個數為例。 第一步:先把8562拆分成8,85,856,8562這四個數。怎么拆分呢?用求商的算法。比如: 8等于8562/1000; 85等于8562/100; 856等于8562/10; 8562等于8562/1; 第二步:再從8,85,856,8562這四個數中分別提取8,5,6,2這四個數。怎么提取呢?用求余的算法。比如: 8等于8%10; 5等于85%10; 6等于856%10; 2等于8562%10; 第三步:最后,把第一步和第二步的處理思路連寫在一起如下: 8等于8562/1000%10; 5等于8562/100%10; 6等于8562/10%10; 2等于8562/1%10; 上述的規律感也是特別清晰的。 【29.3 “先余后商”和“先商后余”哪家強?】 上面講了“先余后商”和“先商后余”這兩種思路,到底哪種思路在實際項目中更好呢?其實我個人傾向于后者的“先商后余”,為什么呢?請看這個例子,以3100000000這個數為例,要提取該數的“十億”位3。 第一種:用“先余后商”的套路如下: 3等于3100000000%10000000000/1000000000; 這里出現了一個問題,我們知道,unsigned long類型最大的數據是0xffffffff,轉換成十進制后最大的數是4294967295,但是上面出現的10000000000這個數比unsigned long類型最大的數據4294967295還要大,這個就會引來我個人的擔憂,C編譯器到底會怎么處理,很有可能會出現意想不到的錯誤,至少會讓我感到心里不踏實。當然,也許會有一些朋友說,這個是多慮的,最高位完全可以把求余這一步省略,這個說法也對,但是作為一種“套路”,我還是喜歡“套路”的對稱感,“套路”之所以成為“套路”,是因為有一種對稱感。下面再看看如果用“先商后余”的思路來處理,會不會出現這個擔憂。 第二種:用“先商后余”的套路如下: 3等于3100000000/1000000000%10; 這一次,上面出現的1000000000這個數比unsigned long類型最大的數據4294967295小,所以沒有剛才那種擔憂,也維護了“套路”的對稱感。所以我在實際項目中喜歡用這種方法。 【29.4 例程練習和分析。】 現在編寫一個程序來驗證剛才講到的兩種思路: 程序代碼如下: /\*---C語言學習區域的開始。-----------------------------------------------\*/ void main() //主函數 { unsigned char a; //千位 unsigned char b; //百位 unsigned char c; //十位 unsigned char d; //個位 unsigned char e; //千位 unsigned char f; //百位 unsigned char g; //十位 unsigned char h; //個位 //x初始化為8562,必須是unsignd int類型以上,不能是char類型,char最大范圍是255。 unsigned int x=8562; //被提取的數 //第一種:先余后商。 a=x%10000/1000; //提取千位 b=x%1000/100; //提取百位 c=x%100/10; //提取十位 d=x%10/1; //提取個位 //第二種:先商后余。 e=x/1000%10; //提取千位 f=x/100%10; //提取百位 g=x/10%10; //提取十位 h=x/1%10; //提取個位 View(a); //把第1個數a發送到電腦端的串口助手軟件上觀察。 View(b); //把第2個數b發送到電腦端的串口助手軟件上觀察。 View(c); //把第3個數c發送到電腦端的串口助手軟件上觀察。 View(d); //把第4個數d發送到電腦端的串口助手軟件上觀察。 View(e); //把第5個數e發送到電腦端的串口助手軟件上觀察。 View(f); //把第6個數f發送到電腦端的串口助手軟件上觀察。 View(g); //把第7個數g發送到電腦端的串口助手軟件上觀察。 View(h); //把第8個數h發送到電腦端的串口助手軟件上觀察。 while(1) { } } /\*---C語言學習區域的結束。-----------------------------------------------\*/ 在電腦串口助手軟件上觀察到的程序執行現象如下: 開始... 第1個數 十進制:8 十六進制:8 二進制:1000 第2個數 十進制:5 十六進制:5 二進制:101 第3個數 十進制:6 十六進制:6 二進制:110 第4個數 十進制:2 十六進制:2 二進制:10 第5個數 十進制:8 十六進制:8 二進制:1000 第6個數 十進制:5 十六進制:5 二進制:101 第7個數 十進制:6 十六進制:6 二進制:110 第8個數 十進制:2 十六進制:2 二進制:10 分析: 通過實驗結果,發現在單片機上的計算結果和我們的分析是一致的。 【29.5 如何在單片機上練習本章節C語言程序?】 直接復制前面章節中第十一節的模板程序,練習代碼時只需要更改“C語言學習區域”的代碼就可以了,其它部分的代碼不要動。編譯后,把程序下載進帶串口的51學習板,通過電腦端的串口助手軟件就可以觀察到不同的變量數值,詳細方法請看第十一節內容。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看