位運(yùn)算之左移右移運(yùn)算之詳解
先看如下一段左移右移的代碼及其結(jié)果:
#include
"
stdio.h
"
char
leftshift(
char
i,
int
n) {
if
(n
<
0
)
return
-
1
;
return
i
<<
n; }
char
rightshift(
char
i,
int
n) {
if
(n
<
0
)
return
-
1
;
return
i
>>
n; }
int
main() {
//
leftshift
char
a1
=
127
;
char
a2
=
-
1
;
for
(
int
i
=
1
; i
<=
8
; i
++
) printf(
"
%d<<%d = %d;\n
"
, a1, i, leftshift(a1,i));
for
(i
=
1
; i
<=
8
; i
++
) printf(
"
%d<<%d = %d;\n
"
, a2, i, leftshift(a2,i));
//
rightshift
a1
=
127
; a2
=
-
128
;
for
(i
=
1
; i
<=
8
; i
++
) printf(
"
%d>>%d = %d;\n
"
, a1, i, rightshift(a1,i));
for
(i
=
1
; i
<=
8
; i
++
) printf(
"
%d>>%d = %d;\n
"
, a2, i, rightshift(a2,i));
return
0
; }
結(jié)果為:
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
;
-
1
<<
2
=
-
4
;
-
1
<<
3
=
-
8
;
-
1
<<
4
=
-
16
;
-
1
<<
5
=
-
32
;
-
1
<<
6
=
-
64
;
-
1
<<
7
=
-
128
;
-
1
<<
8
=
0
;
127
>>
1
=
63
;
127
>>
2
=
31
;
127
>>
3
=
15
;
127
>>
4
=
7
;
127
>>
5
=
3
;
127
>>
6
=
1
;
127
>>
7
=
0
;
127
>>
8
=
0
;
-
128
>>
1
=
-
64
;
-
128
>>
2
=
-
32
;
-
128
>>
3
=
-
16
;
-
128
>>
4
=
-
8
;
-
128
>>
5
=
-
4
;
-
128
>>
6
=
-
2
;
-
128
>>
7
=
-
1
;
-
128
>>
8
=
-
1
;
左邊空出的位用0或者1填補(bǔ)。正數(shù)用0填補(bǔ),負(fù)數(shù)用1填補(bǔ)。注:不同的環(huán)境填補(bǔ)方式可能不同;
低位右移溢出則舍棄該位。
1、127的補(bǔ)碼:0111 1111
右移一位: 0011 1111 -> 原碼同補(bǔ)碼一樣 對應(yīng)十進(jìn)制:63
右移二位: 0001 1111 -> 原碼同補(bǔ)碼一樣 對應(yīng)十進(jìn)制:31
右移三位: 0000 1111 -> 原碼同補(bǔ)碼一樣 對應(yīng)十進(jìn)制:15
右移四位: 0000 0111 -> 原碼同補(bǔ)碼一樣 對應(yīng)十進(jìn)制:7
右移五位: 0000 0011 -> 原碼同補(bǔ)碼一樣 對應(yīng)十進(jìn)制:3
右移六位: 0000 0001 -> 原碼同補(bǔ)碼一樣 對應(yīng)十進(jìn)制:1
右移七位: 0000 0000 -> 原碼同補(bǔ)碼一樣 對應(yīng)十進(jìn)制:0
右移八位: 0000 0000 -> 原碼同補(bǔ)碼一樣 對應(yīng)十進(jìn)制:0
2、-128的補(bǔ)碼:1000 0000
右移一位: 1100 0000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1100 0000 對應(yīng)十進(jìn)制:-64
右移二位: 1110 0000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1010 0000 對應(yīng)十進(jìn)制:-32
右移三位: 1111 0000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1001 0000 對應(yīng)十進(jìn)制:-16
右移四位: 1111 1000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 1000 對應(yīng)十進(jìn)制:-8
右移五位: 1111 1100 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 0100 對應(yīng)十進(jìn)制:-4
右移六位: 1111 1110 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 0010 對應(yīng)十進(jìn)制:-2
右移七位: 1111 1111 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 0001 對應(yīng)十進(jìn)制:-1
右移八位: 1111 1111 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 0001 對應(yīng)十進(jìn)制:-1
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

