C 位運算之 左移運算和右移運算

2021-08-18 10:11:08 字數 1665 閱讀 1840

在c中,位運算包含兩種移位運算:

左移運算:<<

右移運算:>>

左右位移運算,在數值為無符號和有符號情況下具有不同行為。

有符號左右位移運算

#include 

#include

#include

// signed int左移

void si_left_shift(signed

int si, int n)

// signed int右移

void si_right_shift(signed

int si, int n)

int main()

編譯 && 執行:

$ gcc -o shift

shift.c

$ ./shift

12345678

<< 4: 23456780

12345678 >> 4: 01234567

fedcba98 << 4: edcba980

fedcba98 >> 4: ffedcba9

對於有符號數:

如果數值非負,左移直接丟棄最高位,在低位補對應個數的0;

如果數值非負,右移直接丟棄最低位,在高位補對應個數的0;

如果數值為負,左移直接丟棄最高位,在低位補對應個數的0;

如果數值為負,右移直接丟棄最低位,在高位補對應個數的1

請特別注意,有符號數值右移,高位補的總是原來的符號位值。

(ps:這裡一次性移位4bit,僅為方便觀察結果輸出,若非4的倍數,還需進行計算,想想為什麼?)

無符號左右位移運算

#include 

#include

#include

// unsigned int左移

void ui_left_shift(unsigned

int ui, int n)

// unsigned int右移

void ui_right_shift(unsigned

int ui, int n)

int main()

編譯 && 執行:

$ gcc -o shift

shift.c

$ ./shift

12345678

<< 4: 23456780

12345678 >> 4: 01234567

fedcba98 << 4: edcba980

fedcba98 >> 4: 0fedcba9

對於無符號數:

左移直接丟棄最高位,在低位補對應個數的0;

右移直接丟棄最低位,在高位補對應個數的0,即使最高位原來是1

請特別注意,對於無符號數,不存在正負之分,只有最高位是否為1的區別。

通過對比無符號和有符號數的左右位移結果,我們可知:

1.對於無符號數,不論最高位是否為1,當右移時,高位總是補0;

2.對於有符號數,當右移時,高位總是按位移前最高位值補齊,即,真實的數值符號總是不變的;

3.左移時,不論是否有符號,都丟棄最高位,低位補對應個數的0;

位運算之左移右移運算之詳解

include stdio.h char leftshift char i,int n int main 結果 1 2 2 4 3 8 4 16 5 32 6 64 7 128 8 0 1 1 2 1 2 4 1 3 8 1 4 16 1 5 32 1 6 64 1 7 128 1 8 0 1 63...

位運算之左移右移運算之詳解

宣告 僅作學習筆記知識點記錄。include stdio.h char leftshift char i,int n int main 結果為 結果 127 1 2 127 2 4 127 3 8 127 4 16 127 5 32 127 6 64 127 7 128 127 8 0 1 1 2 ...

位運算之左移右移運算之詳解

include stdio.h char leftshift char i,int n char rightshift char i,int n int main 結果為 結果127 1 2 127 2 4 127 3 8 127 4 16 127 5 32 127 6 64 127 7 128 1...