回覆列表
  • 1 # 老馬識途微控制器

    關於這個問題,需要好好學習一下C語言中的移位操作(由於你問題中沒有說明是在組合語言環境下,還是C語言環境下,所以在這裡我就假設你是在C語言環境下進行的移位操作)。

    移位操作的含義

    移位運算子是位操作運算子的一種。移位運算子在二進位制的基礎上對數字進行平移。按照平移的方向和填充數字的規則分為:<<(左移)、、>>右移、>>(帶符號右移)和<<(帶符號左移)。

    需要特別注意的是,移位運算是按照二進位制數字進行操作的。

    例如對於十進位制數89進行移位操作的話,需要先把十進位制數89轉化為二進位制數1000 1001,然後才能進行移位運算。

    算術右移和邏輯右移

    我們知道,在實際生活中,整數有正有負,所以在進行移位操作的時候,正整數和負整數的移位操作是不同的。

    1、邏輯右移

    邏輯右移就是不考慮符號位,右移一位,左邊補零即可。

    2、算術右移

    算術右移需要考慮符號位,右移一位,若符號位為1,就在左邊補1,;否則,就補0。

    所以算術右移也可以進行有符號位的除法,右移,n位就等於除2的n次方。

    舉個例子來說明一下。

    還用上面說的十進位制數正89,它的二進位制數為1000 1001.

    對於正整數89來說,右移一位後變成 (0)100 0100 (1).其中左邊的0,是移位時補的0,最右邊括號中的1,是經過移位操作後,移出去的那一位。這就是邏輯右移

    對於二進位制數89,如果它是有符號數,那它表示的十進位制數就不是89了,而是-9.對它進行右移一位的操作後,變成 (1)100 0100 (1)。這就是算術右移。

  • 2 # 尹海龍18310988757

    微控制器右移分為算術右移和邏輯右移。(左移沒有這個問題,0x01<<i就正確)

    算術右移最高位是符號位,右移後符號位保持不變(如果一直右移會導致所有位都變成和最高位一樣的值)。

    邏輯右移才是最高位補0。

    led因為是char,編譯器會把">>"解釋成算術右移,即最高位是符號位,保持不變。最後導致結果不對。

    led要定義為unsigned char就應該也對了。

  • 中秋節和大豐收的關聯?
  • 拿了別人的手機並賠償損失,可失主拒寫收據該怎麼辦?