<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國際加速解決方案。 廣告
                【35.1 “右移”運算。】 “右移”運算也是以位為單位進行運算的。位是指二進制中的某一位,位只能是0或者1。欲理解某個數“右移”運算的內部規律,必先把該數展開成二進制的格式,然后才好分析。“右移”運算的符號是“>>”,它的通用格式如下: “保存變量”=“被移數”>>n; 運算規律是:“被移數”先被復制一份放到某個隱蔽的臨時變量(也稱作寄存器),然后對此臨時變量展開成二進制的格式,左邊是高位,右邊是低位,此二進制格式的臨時變量被整體由左往右移動了n位,原來左邊由于數據位移動而新空出的高n位數據被直接填入0,而右邊由于數據位移動而導致低n位數據被直接覆蓋,最后再把移位運算的結果存入“保存變量”。多問一句,這行代碼執行完畢后,“保存變量”和“被移數”到底哪個變量發生了變化,哪個變量維持不變?大家記住,只有賦值語句“=”左邊的“保存變量”發生數值變化,而右邊的“被移數”沒有發生變化,因為“被移數”被操作的不是它自己本身,而是它的復制品替身(某個隱蔽的臨時變量,也稱寄存器)。 上述通用格式中的n代表被一次右移的位數,可以取0,當n等于0的時候,代表右移0位,其實就是數值維持原來的樣子沒有發生變化。 現在舉一個完整的例子來分析“>>”右移運算的規律。有兩個unsigned char類型的變量a和b,它們的數值都是十進制的5,求a=a>>1和b=b>>2的結果分別是多少?分析步驟如下: 第一步:先把a和b變量原來的數值以二進制的格式展開。十進制轉二進制的方法請參考前面第14,15,16節的內容。 a變量是十進制5,它的二進制格式是: 00000101。 b變量是十進制5,它的二進制格式是: 00000101。 第二步:將a右移1位,將b右移2位。 (1)a=a>>1,就是將a右移1位。 a右移前是 -> 00000101 a右移1位后是 -> 00000010 結果分析:把二進制的00000010轉換成十六進制是:0x02。轉換成十進制是2。所以a初始值是5,右移1位后的結果是2。 (2)b=b>>2,就是將b右移2位。 b右移前是 -> 00000101 b右移2位后是 -> 00000001 結果分析:把二進制的00000001轉換成十六進制是:0x01。轉換成十進制是1。所以b初始值是5,右移2位后的結果是1。 **【35.2** **“右移”與除法的關系。】** 左移一位相當于乘以2,而右移跟左移恰恰相反,右移一位相當于除以2,注意,這里的除法是整除,不帶小數點的。比如上面例子,5右移1位就變成了2(相當于5整除2等于2),5右移2位就變成了1(相當于5整除2再整除2等于1)。這個現象背后的規律是:在右移運算中,每右移1位就相當于整除2,右移2位相當于整除2再整除2,右移3位相當于整除2再整除2再整除2......以此類推。這個規律反過來從除法的角度看,也是成立的:某個數整除2,就相當于右移1位,某個數整除2再整除2相當于右移2位,某個數整除2再整除2再整除2相當于右3位......以此類推。那么問題來了,同樣是達到整除2的運算結果,從運算速度的角度對比,“右移”和“整除”哪家強?答案是:一條右移語句的運算速度比一條整除語句的運算速度要快很多倍。 **【35.3** **“右移”的常見應用:不同數據類型之間的分解。】** 比如有一個雙字節unsigned int類型的變量c,它的初始值是0x1234,要把它分解成兩個unsigned char單字節的類型數據H和L,其中H是高8位字節,L是低8位字節,分解后H應該等于0x12,L應該等于0x34,此程序如何寫?就需要用到右移。程序分析如下: unsigned char H; //單字節 unsigned char L; //單字節 unsigned int c=0x1234; //雙字節 L=c; //c的低8位直接賦值給單字節的L H=c>>8; //c先把高8位右移到低8位,然后再把這8位數據賦值給H 程序運行結果:H就等于十六進制的0x12,十進制是18。L就等于十六進制的0x34,十進制是52.提一個問題,請問執行完上述最后一條語句H=c>>8后,此時c的值是多少?答案是c仍然等于0x1234,因為c本身沒有發生變化,只要它沒有賦值給它自己,執行完語句后就不會改變它自己本身,也就是本節開篇就提到的:“被移數”被操作的不是它自己本身,而是它的復制品替身(某個隱蔽的臨時變量,也稱寄存器)。 **【35.4** **右移運算的“右移簡寫”。】** 當被移數是“保存變量”時,存在“右移簡寫”。 “保存變量”=“保存變量”>>n; 上述右移簡寫如下: “保存變量”>>=n; 比如: unsigned char d=8; unsigned char e=8; d>>=1; //就相當于d=d>>1; e>>=2; //就相當于e=e>>2; 【35.5 例程練習和分析。】 現在編寫一個程序來驗證剛才講到的“右移”運算: 程序代碼如下: /\*---C語言學習區域的開始。-----------------------------------------------\*/ void main() //主函數 { unsigned char a=5; unsigned char b=5; unsigned char H; //單字節 unsigned char L; //單字節 unsigned int c=0x1234; //雙字節 unsigned char d=8; unsigned char e=8; //右移運算中蘊含著整除2的規律。 a=a>>1; //a右移1位,相當于a=a/2,從原來的5變成了2。 b=b>>2; //b右移2位,相當于b=b/2/2,從原來的5變成了1。 //右移的常見應用:不同變量類型的分解。 L=c; //c的低8位直接賦值給單字節的L H=c>>8; //c先把高8位右移到低8位,然后再把這8位數據賦值給H //右移簡寫。 d>>=1; //就相當于d=d>>1; e>>=2; //就相當于e=e>>2; View(a); //把第1個數a發送到電腦端的串口助手軟件上觀察。 View(b); //把第2個數b發送到電腦端的串口助手軟件上觀察。 View(H); //把第3個數H發送到電腦端的串口助手軟件上觀察。 View(L); //把第4個數L發送到電腦端的串口助手軟件上觀察。 View(d); //把第5個數d發送到電腦端的串口助手軟件上觀察。 View(e); //把第6個數e發送到電腦端的串口助手軟件上觀察。 while(1) { } } /\*---C語言學習區域的結束。-----------------------------------------------\*/ 在電腦串口助手軟件上觀察到的程序執行現象如下: 開始... 第1個數 十進制:2 十六進制:2 二進制:10 第2個數 十進制:1 十六進制:1 二進制:1 第3個數 十進制:18 十六進制:12 二進制:10010 第4個數 十進制:52 十六進制:34 二進制:110100 第5個數 十進制:4 十六進制:4 二進制:100 第6個數 十進制:2 十六進制:2 二進制:10 分析: 通過實驗結果,發現在單片機上的計算結果和我們的分析是一致的。 【35.6 如何在單片機上練習本章節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>

                              哎呀哎呀视频在线观看