我們常用的移位操作是<< 和 >> ,分别為左移和右移。
當我們在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.進階語言右移和彙編語言中的邏輯右移功能一樣,但不同于算術右移