算數左移位

算數左移位

移位操作是計算機指令中比較基本的操作,是位運算的一種。在移位運算時,byte、short和char類型移位後的結果會變成int類型,對於byte、short、char和int進行移位時,編譯器未做任何最佳化的情況下(最佳化後不可預期),規定實際移動的次數是移動次數和32的餘數,也就是移位33次和移位1次得到的結果相同。移動long型的數值時,規定實際移動的次數是移動次數和64的餘數,也就是移動66次和移動2次得到的結果相同。 算數左移位,即算術左移位,是一種帶符號的左移位運算。

簡介

在計算機指令中,移位操作是一種基本操作,是一種直接對二進制數據的位運算操作。

而移位運算又包含了邏輯移位(logical shift)和算術移位(arithmetic shift)兩種。

邏輯移位:移出去的位丟棄,空缺位(vacant bit)用 0 填充。

算術移位:移出去的位丟棄,空缺位(vacant bit)用“符號位”來填充,所以一般用在右移運算中。

舉例

對於二進制數1010101010進行算術移位操作,其中[]是添加的位:

算數左移一位:010101010 [ 0]

算數右移一位[1]101010101

算術移位與邏輯移位

①如果是無符號數,不管是左移還是右移都是“邏輯移位”

例如,分別對無符號數179做左移、右移操作的結果,

圖1 邏輯左移 圖1 邏輯左移
圖2 邏輯右移 圖2 邏輯右移

②如果是有符號數,則做 左移運算,即做的是“邏輯移位”,同 ①中無符號數的左移。而 做右移運算,那么做的是“算術移位”。

圖3 帶符號位1的算術右移 圖3 帶符號位1的算術右移
算數左移位 算數左移位

這裡的進位位C,它就是標誌暫存器(即狀態暫存器,亦稱程式狀態字暫存器PSW)中的那個進位位,指示是否有進位或者借位,若有則該位為1,否則為0。邏輯左移跟算術左移完全一樣。而邏輯右移跟算術右移則不一樣,邏輯右移的最高位在移出後補0,而在算術右移中,最高位(這裡的最高位指整個編碼的最高位,即有符號數的符號位)不變,其他跟邏輯右移一樣。

算術左移和算術右移主要用來進行有符號數的倍增、減半; 邏輯左移和邏輯右移主要用來進行無符號數的倍增、減半。

有符號和無符號的算術左移雖然方式是一樣的,但他們表示的移位後數的範圍是不一樣的,有符號數左移(算術左移)位後的範圍是-128——127【指8位】。而無符號數(算術左移)左移的範圍是0——255【指8位】。

相關

循環移位

循環移位分為帶進位位C和不帶進位位C兩種:

圖5 循環移位 圖5 循環移位

注意,在循環移位中沒有算術、邏輯之分,只有是否帶進位位之分。在循環移位中,只有“帶進位的循環右移”這種方式中,進位位C才對移位後的結果產生影響,其他的進位位都是受影響(被新移入的二進制位覆蓋)。

相關詞條

熱門詞條

聯絡我們