天天看點

有關移位操作

我們常用的移位操作是<< 和 >> ,分别為左移和右移。

當我們在C語言中有算數移位和邏輯移位兩種。

JS中有>>和>>>的差別

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

算數移位:就是區分符号的移位       {c語言中直接是定義char m = 3}

邏輯移位:就是不區分符号的移位   {c語言中用unsigned char m = 3}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

好了讓我們看看算數移位和邏輯移位有什麼不同:

例如:

(1)對無符号數3來說,x<<1往左移一位,最左邊的位移掉了,最右邊的移進來的位補零。變成

00000110,是以結果是6;x>>1往右邊移一位,由于是無符号數,是以邏輯右移,最右邊一位移掉,

最左邊移進來的位補零,變成00000001,是以結果是1。

(2)對于有符号數3來說,x<<1往左移一位,最左邊的位移掉了,最右邊的移進來的位補零。變成

00000110,是以結果是6;x>>1往右邊移一位,由于是有符号數,可能發生邏輯右移,也可能發生算術右移

,這一點,C标準并沒有明确地指定是使用邏輯右移還是算術右移。但大多數的機器都使用算術右移,變成

00000001,是以結果還是1。但是請注意,這隻是說大多數的機器是這樣的,你敢保證自己

不會碰到特殊情況嗎?

(3)對于有符号數-3來說,x<<1往左移一位,最左邊的位移掉了,最右邊的移進來的位補零。變成

11111010,結果是-6。往右移一位,由于是有符号數,可能發生邏輯右移,也可能發生算術右移。

大多數機器使用算術右移,變成11111110,結果是-2。

總結:左移時總是移位和補零。右移時無符号數是移位和補零,此時稱為邏輯右移;

而有符号數大多數情況下是移位和補最左邊的位(也就是補最高有效位),移幾位就補幾位,此時稱為算術右移。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

補充

1.彙編語言中的邏輯右移(SHR)是将各位依次右移指定位數,然後在左側補0,算術右移(SAR)是将各位依次右移指定位數,然後在左側用原符号位補齊。 

2.進階語言右移運算符(>>)是将一個數的二進位全部右移若幹位,低位移出部分舍棄,左補0。  

3.進階語言右移和彙編語言中的邏輯右移功能一樣,但不同于算術右移

繼續閱讀