Professional Documents
Culture Documents
Phép Toán Thao Tác Bit
Phép Toán Thao Tác Bit
Trong ngn ng my tnh, cc php ton trn thao tc bit (ting Anh: bitwise operation) c thc hin
trn mt hoc nhiu chui bit hoc s nh phn ti cp ca tng bit ring bit. Cc php ton ny c
thc hin nhanh, u tin, c h tr trc tip bi vi x l, v c dng iu khin cc gi tr dng
cho so snh v tnh ton.
i vi cc loi vi x l r tin, thng th cc php ton trn thao tc bit nhanh hn php chia ng k, i
khi nhanh hn php nhn, v i khi nhanh hn php cng ng k. Trong khi cc vi x l hin i thng
thc hin php nhn v php cng nhanh tng ng cc php ton trn thao tc bit nh vo cu trc
ng ng lnh ca chng di hn v cng nh vo cc la chn trong thit k cu trc, cc php ton trn
thao tc bit thng s dng t nng lng hn v s dng t ti nguyn hn.
Mc lc
1 Cc ton t thao tc bit
1.1 AND
1.2 NOT
1.3 OR
1.4 XOR
2 Dch chuyn v quay bit
2.1 Dch chuyn s hc
2.2 Dch chuyn lun l
2.3 Quay khng nh
2.4 Quay c nh
2.5 Dch chuyn trong C, C++, C# v Python
2.6 Dch chuyn trong Java
2.7 Dch chuyn trong Pascal
3 ng dng
4 Xem thm
5 Tham kho
Trong cc gii thch di y, bt k du hin no ca v tr mt bit c tnh t pha bn phi (nh nht),
tin dn v bn tri. V d: s nh phn 0001 (s mt trong h thp phn) c cc s 0 mi v tr tr v tr
u tin.
AND
Ton t thao tc bit AND ly 2 ton hng nh nhn c chiu di bng nhau v thc hin php ton l lun
AND trn mi cp bit tng ng bng cch nhn chng li vi nhau. Nh , nu c hai bit v tr c so
snh u l 1, th bit hin th dng nh phn s l 1 (1 x 1 = 1); ngc li th kt qu s l 0 (1 x 0 = 0). V
d:
A B A&B
0 0 0
0 1 0
1 0 0
1 1 1
Php ton ny c th c s dng xc nh xem nu mt bit c thit t (1) hoc trng (0). V d:
Cho trc dy bit 0011 (s 3 trong h thp phn), xc nh xem bit th 2 c c thit t hay khng, ta
s php ton thao tc bit AND vi mt dy bit c cha s 1 duy nht bit th 2, v d:
V c tnh ny, vic kim tra tnh chn l ca s nh phn tr nn d dng bng cch kim tra gi tr ca
bit c gi tr thp nht. S dng v d pha trn ta c:
NOT
0 1
1 0
NOT x = -x 1
i vi cc s nguyn khng m, php ton thao tc bit ly phn b ca mt s l hnh nh phn chiu
ca s tnh ti im gia ca gii hn s nguyn khng m. Vi d: i vi s nguyn 8-bit, NOT x =
255 x , c th c biu din trn th di dng mt ng thng i xung m ng thng lt
mt dy tng dn t 0 n 255, n mt dy gim dn t 255 xung 0. Mt v d n gin nhng d hnh
dung l vic o ngc mt hnh nh trng en m mi pixel trong c coi l mt s nguyn khng m.
Trong cc ngn ng lp trnh C, C++, Java, C#, ton t thao tc bit NOT c biu din bng k hiu "~"
(du ng). Trong Pascal, ton t ny l " not ". V d:
x = ~y; // C
Hay
Cu lnh trn s gn cho x gi tr "NOT y" - tc phn b ca y. Ch rng, ton t ny khng tng ng
vi ton t lun l "not" (biu din bng du chm than " ! " trong C/C++). V vn ny, xin xem bi
ton t hoc cc bi v ngn ng C/C++.
OR
Php ton trn thao tc bit OR ly hai dy bit c di bng nhau v thc hin php ton l lun bao hm
OR trn mi cp bit tng ng. Kt qu mi v tr s l 0 nu c hai bit l 0, ngc li th kt qu l 1.
V d:
A B A OR B
0 0 0
0 1 1
1 0 1
1 1 1
Trong C, C++, Java, C#, ton t thao tc bit OR c biu din bng k hiu " | " (vch ng). Trong
Pascal, ton t ny l " or ". V d:
x = y | z; // C
Hay:
x:= y or z; { Pascal }
Cu lnh trn s gn cho x kt qu ca "y OR z". Ch rng ton t ny khng tng ng vi ton t
lun l "or" (biu din bng cp vch ng "||" trong C/C++). V vn ny, xin xem bi ton t hoc
cc bi v ngn ng C/C++.
K thut ny l mt cch hiu qu lu tr mt s trong nhng gi tr php ton logic ng sai (boolean)
s dng t b nh nht c th.
Khi lm vic vi cc my khng c nhiu khng gian b nh trng, cc lp trnh vin thng p dng k
thut trn. Lc , thay v khai bo tm bin kiu bool (C++) c lp, ngi ta s dng tng bit ring l
ca mt byte biu din gi tr cho tm bin .
XOR
Php ton thao tc bit XOR ly hai dy bit c cng di v thc hin php ton logic bao hm XOR trn
mi cp bit tng ng. Kt qu mi v tr l 1 ch khi bit u tin l 1 hoc nu ch khi bit th hai l 1,
nhng s l 0 nu c hai l 0 hoc c hai l 1. y ta thc hin php so snh hai bit, kt qu l 1 nu hai
bit khc nhau v l 0 nu hai bit ging nhau. V d:
A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0
Php ton thao tc bit XOR c th c s dng o ngc cc bit c la chn trong thanh ghi (cn
c gi l bt (set) hoc lt (flip)). Bt k bit no c bt bng cch thc hin php ton thao tc bit
XOR n vi 1. V d: cho dy bit 0010 (s 2 thp phn), bit th hai v th t c th c kch hot bng
cch s dng php ton thao tc bit XOR vi mt dy bit c cha 1 v tr th hai v th t:
0010 (s thp phn 2)
XOR 1010 (s thp phn 10)
= 1000 (s thp phn 8)
K thut ny c th c s dng iu khin dy bit biu hin cc b cha php ton logic ng sai
(boolean).
Trong C, C++, Java, C#, ton t thao tc bit XOR c biu din bng k hiu " ^ " (du m). Trong Pascal,
ton t ny l " xor ". V d:
x = y ^ z; // C
Hay:
Dch chuyn s hc
Quay khng nh
Quay c nh
Quay c nh tng t vi php quay khng nh, nhng hai u ca thanh ghi c tch ra bi c nh (carry
flag). Bit c dch chuyn vo ( bt k u no) l gi tr c ca c nh, v bit c dch chuyn ra (
u cn li) tr thnh gi tr mi ca c nh.
Mt php quay c nh c th m phng mt php quay lun l hoc s hc ca mt v tr bng cch thit
lp c nh trc tin. V d, nu c nh mang gi tr 0, th x XOAY-PHI-C-NH-MT-LN l php dch
chuyn lun l sang phi, v nu c nh gi gi tr ca bn sao chp ca bit cha du, th x XOAY-PHI-
C-NH-MT-LN l php dch chuyn s hc sang phi. V l do ny, mt s vi iu khin nh cc PIC
tm thp ch c xoay v xoay c nh, m khng cn n cc cu trc dch chuyn s hc v lun l.
Trong cc ngn ng da trn C, cc ton t dch chuyn tri v phi ln lt l << v >> . S lng cn
dch chuyn c cung cp i s th hai ca ton t dch chuyn. V d:
x = y << 2;
gn cho x kt qu ca php dch chuyn y sang tri 2 bit, tng ng vi php nhn vi 4.
Trong ngn ng C, kt qu ca vic dch chuyn sang phi mt gi tr m l xc nh, v gi tr ca php
dch chuyn sang tri ca gi tr cha du l khng xc nh nu kt qu khng c th hin di dng
ca kt qu. Trong C#, php dch chuyn sang phi l mt php dch chuyn s hc khi m ton hng l
bin kiu int hoc long . Nu ton hng u tin thuc kiu uint hoc ulong , php dch chuyn sang
phi l php dch chuyn lun l.
Trong Java, tt c cc gi tr mang kiu s nguyn u c du, v cc ton t << v >> thc hin cc
php dch chuyn s hc. Java cn thm vo ton t >>> thc hin php dch chuyn lun l sang phi,
nhng bi v php dch chuyn sang tri s hc v lun l l nh nhau, nn khng c ton t <<< trong
Java.
Thao tc << (dch tri), >> (dch phi c du), v >>> (dch phi khng du) c gi l cc ton
t dch chuyn.
Kiu gi tr m php dch bit biu th l dng cao cp ca ton hng bn tri. V d, aByte >>> 2 th
tng ng vi ((int) aByte) >>> 2 .
Nu nh kiu gi tr cao cp ca ton hng bn tri l int , th ch c nm bit thp nht theo th t
ca ton hng bn phi c s dng nh l khong cch dch chuyn. iu ny ging nh l ton
hng bn phi c s dng cho mt ton t lun l thao tc bit AND & vi gi tr che y 0x1f
(0b11111). Khong cch dch chuyn thc ra lun nm trong khong t 0 ti 31, mt cch bao qut.
Nu nh kiu gi tr cao cp ca ton hng bn tri l long , th ch c su bit thp nht theo t t
ca ton hng bn phi c s dng nh l khong cch dch chuyn. iu ging nh l ton
hng bn phi c s dng cho mt ton t lun l thao tc bit AND & vi gi tr che y 0x3f
(0b111111). Khong cch dch chuyn thc ra lun nm trong khong t 0 ti 63, mt cch bao qut.
Kt qu ca n >>> s l n b dch chuyn sang phi s bit v m 0 vo bn tri tng ng.
Trong ton t ni chung v php dch bit ni ring, kiu d liu byte c hm chuyn thnh
int . Nu gi tr byte l m, v bit bc cao nht l mt, th cc s mt s c in vo lp
y cc bytes c thm vo kiu int . Do byte b1=-5; int i = b1 | 0x0200 ; s cho kt
qu i == -5 .
Trong Pascal, cng nh cc trnh bin dch tng t n (nh l Object Pascal v Standard Pascal), cc thao tc
dch tri v dch phi ln lt l shl v shr . Khong cch dch chuyn s c thm vo trong i s
th hai. V d, cu lnh sau cho x l kt qu ca php dch y sang tri hai bit:
x:= y shl 2;
ng dng
Cc php ton trn thao tc bit l c bit cn thit trong cc ngn ng lp trnh bc thp nh cc ngn ng
dng vit ra cc trnh cm thit b (drivers), ha bc thp, hnh thnh gi giao thc cc truyn thng,
v gii m.
Mc d cc h thng my thng c sn cc cu trc (instructions) hiu qu cho vic thc hin cc php
ton hc v php lun l (logic), tuy nhin trong thc t, cc thao thc ny c th c thc hin bng cch
kt hp cc ton t thao tc bit v php th s 0 (zero-testing) bng nhiu cch khc nhau. V d, di y l
m gii (pseudocode) ca php nhn Ai Cp c i ch ra cch c th nhn hai s nguyn ty thch a v
b (trong a ln hn b ) m ch cn s dng thao tc dch chuyn bit v php cng:
c = 0
while b 0
if (b and 1) 0
c = c + a
left shift a by 1
right shift b by 1
return c
while a 0
c = b and a
b = b xor a
left shift c by 1
a = c
return b
Xem thm
Ba Karnaugh
Tham kho
Ly t https://vi.wikipedia.org/w/index.php?title=Php_ton_thao_tc_bit&oldid=26742673