天天看點

c語言之移位運算移位運算

移位運算

左移

邏輯左移和算數左移的效果是一樣的,高位移出,低位補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語言裡對于有符号數可以是邏輯右移,但是幾乎所有編譯器都是算術右移,對于無符号數必須是邏輯右移的。

繼續閱讀