天天看點

關于移位操作

左移:不管是有符号數還是無符号數,數位都往左移動n位,右邊用0補足。如果左移的位數超過整數本身的位數,結果不知道。VS上測試結果是從頭開始。

例子(VS,32位機器):

int類型,原始值0x1,左移31位後是0x80000000。左移32位後是0x1。原始值0x11,左移31位後是0x80000000,左移32位後是0x11。

unsigned int類型,同上。

右移:右移包括邏輯右移和算術右移。對于無符号數,隻有邏輯右移,對于有符号數,可以邏輯右移,也可以算術右移,具體的實作因編譯器的不同而不同。

邏輯右移是在左端補0,算術右移是在左端補符号位,如果是正數就補0,如果是負數就補1。

在本機上做實驗,對于無符号數,采用算術右移。

例子:

unsigned int類型,原始值0x80000000,右移一次為0x40000000。

int類型,原始值0x80000000,右移一次為0xC0000000。

如果移位位數超過整數本身的位數,結果從頭開始。同左移。

繼續閱讀