移位運算
左移
邏輯左移和算數左移的效果是一樣的,高位移出,低位補0.
對于一個位長位W的數來說,左移K位。(通常來講K<W)
高k位移出,低k位補0.
把下面這個w位的位向量左移K位。
[ X w − 1 , X w − 2 , X w − 3 , . . . , X 3 , X 2 , X 1 , X 0 ] [X_{w-1},X_{w-2},X_{w-3},...,X_3,X_2,X_1,X_0] [Xw−1,Xw−2,Xw−3,...,X3,X2,X1,X0]
[ X w − k − 1 , X w − k − 2 , . . . , X 3 , X 2 , X 1 , X 0 , 0 , 0 , 0 , 0... , 0 , 0 , 0 ] [X_{w-k-1},X_{w-k-2},...,X_3,X_2,X_1,X_0,0,0,0,0...,0,0,0] [Xw−k−1,Xw−k−2,...,X3,X2,X1,X0,0,0,0,0...,0,0,0]
後面會有K個0.
右移
邏輯右移和算術右移
邏輯右移是低位移出,高位補0的。算數右移的高位是複制最高位的。
邏輯右移
[ X w − 1 , X w − 2 , X w − 3 , . . . , X 3 , X 2 , X 1 , X 0 ] [X_{w-1},X_{w-2},X_{w-3},...,X_3,X_2,X_1,X_0] [Xw−1,Xw−2,Xw−3,...,X3,X2,X1,X0]
[ 0 , 0 , . . . , 0 , 0 , X w − 1 , X w − 2 , X w − 3 , . . . , X k , ] [0,0,...,0,0,X_{w-1},X_{w-2},X_{w-3},...,X_{k},] [0,0,...,0,0,Xw−1,Xw−2,Xw−3,...,Xk,]
這裡補充k個0.
算術右移
[ X w − 1 , X w − 2 , X w − 3 , . . . , X 3 , X 2 , X 1 , X 0 ] [X_{w-1},X_{w-2},X_{w-3},...,X_3,X_2,X_1,X_0] [Xw−1,Xw−2,Xw−3,...,X3,X2,X1,X0]
[ X w − 1 , . . . , X w − 1 , X w − 1 , X w − 1 , X w − 1 , X w − 2 , X w − 3 , . . . , X k , ] [X_{w-1},...,X_{w-1},X_{w-1},X_{w-1},X_{w-1},X_{w-2},X_{w-3},...,X_{k},] [Xw−1,...,Xw−1,Xw−1,Xw−1,Xw−1,Xw−2,Xw−3,...,Xk,]
這裡補k個X_{w-1}_.
舉個例子
操作 | 值 |
---|---|
參數x | [0110 0011] [1001 0101] |
x<<4 | [0011 0000] [0101 0000] |
x>>4(邏輯右移) | [0000 0110] [0000 1001] |
x>>4(算術右移) | [0000 0110] [1111 1001] |
在c語言裡對于有符号數可以是邏輯右移,但是幾乎所有編譯器都是算術右移,對于無符号數必須是邏輯右移的。