簡介
在計算機指令中,移位操作是一種基本操作,是一種直接對二進制數據的位運算操作。
而移位運算又包含了邏輯移位(logical shift)和算術移位(arithmetic shift)兩種。
邏輯移位:移出去的位丟棄,空缺位(vacant bit)用 0 填充。
算術移位:移出去的位丟棄,空缺位(vacant bit)用“符號位”來填充,所以一般用在右移運算中。
舉例
對於二進制數1010101010進行算術移位操作,其中[]是添加的位:
算數左移一位:010101010 [ 0]
算數右移一位: [1]101010101
算術移位與邏輯移位
①如果是無符號數,不管是左移還是右移都是“邏輯移位”
例如,分別對無符號數179做左移、右移操作的結果,
②如果是有符號數,則做 左移運算,即做的是“邏輯移位”,同 ①中無符號數的左移。而 做右移運算,那么做的是“算術移位”。
這裡的進位位C,它就是標誌暫存器(即狀態暫存器,亦稱程式狀態字暫存器PSW)中的那個進位位,指示是否有進位或者借位,若有則該位為1,否則為0。邏輯左移跟算術左移完全一樣。而邏輯右移跟算術右移則不一樣,邏輯右移的最高位在移出後補0,而在算術右移中,最高位(這裡的最高位指整個編碼的最高位,即有符號數的符號位)不變,其他跟邏輯右移一樣。
算術左移和算術右移主要用來進行有符號數的倍增、減半; 邏輯左移和邏輯右移主要用來進行無符號數的倍增、減半。
有符號和無符號的算術左移雖然方式是一樣的,但他們表示的移位後數的範圍是不一樣的,有符號數左移(算術左移)位後的範圍是-128——127【指8位】。而無符號數(算術左移)左移的範圍是0——255【指8位】。
相關
循環移位
循環移位分為帶進位位C和不帶進位位C兩種:
注意,在循環移位中沒有算術、邏輯之分,只有是否帶進位位之分。在循環移位中,只有“帶進位的循環右移”這種方式中,進位位C才對移位後的結果產生影響,其他的進位位都是受影響(被新移入的二進制位覆蓋)。