在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...