Download as pdf or txt
Download as pdf or txt
You are on page 1of 8

Php ton thao tc bit

Bch khoa ton th m Wikipedia

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

Cc ton t thao tc bit


Cc ton t thao tc bit (ting Anh: bitwise operator) l cc ton t c s dng chung vi mt hoc hai
s nh phn to ra mt php ton thao tc bit. Hu ht cc ton t thao tc bit u l cc ton t mt hoc
hai ngi.

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

0101 (s thp phn 5)


AND 0011 (s thp phn 3)
= 0001 (s thp phn 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:

0011 (s thp phn 3)


AND 0010 (s thp phn 2)
= 0010 (s thp phn 2)

V kt qu 0010 l khc 0, ta bit l bit th 2 trong dy bit ban u c thit t. iu ny c gi l


che y bit. (Bng php loi suy, cng dng ca mt n, cc phn khng nn b thay th hoc cc phn
khng c quan tm. Trong trng hp ny, cc gi tr 0 che y cho cc bit khng c quan tm).

Nu ta lu tr kt qu, n c th c s dng lu tr xa cc bit c la chn trong mt thanh


ghi. Cho v d 0110 (s 6 trong h thp phn), bit th 2 c th c xa i bng cch s dng php ton
thao tc bit AND vi dy c mt s 0 duy nht bit th 2:

0110 (s thp phn 6)


AND 1101 (s thp phn 13)
= 0100 (s thp phn 4)

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:

0110 (s thp phn 6)


AND 0001 (s thp phn 1)
= 0000 (s thp phn 0)

NOT

Ton t thao tc bit NOT, hay cn gi l cn c gi l ton t ly phn b (complement), l ton t mt


ngi thc hin ph nh lun l trn tng bit, to thnh b 1 (ones complement) ca gi tr nh phn cho
trc. Bit no l 0 th s tr thnh 1, v 1 s tr thnh 0. V d:

NOT 0111 (s thp phn 7)


= 1000 (s thp phn 8)

Bng chn tr cho NOT:


A NOT A

0 1

1 0

Php ton thao tc bit ly phn b s tng ng vi b 2 (twos complement) ca gi tr c tnh tr i


1. Nu php ton b 2 c s dng, nh vy:

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

x:= not y; { Pascal }

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

Ton t NOT hu dng khi ta cn tm b 1 ca mt s nh phn. N cng c th c s dng lm bc


u tin tm s b 2.

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:

0101 (s thp phn 5)


OR 0011 (s thp phn 3)
= 0111 (s thp phn 7)

Bng chn tr cho OR:

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

Php ton thao tc bit OR c th c s dng thit t bit c chn thnh 1. V d: N c th c


s dng bt (set) mt bit (hoc c) trong thanh ghi, trong mi bit i din cho mt trng thi trong
php logic ng sai (boolean). V th, 0010 (s 2 thp phn) c th c xem l mt b 4 c, trong c
th nht, th ba v th t l trng (0) v c th hai c bt (1). C th t c th c bt bng cch
thc hin php ton thao tc bit OR gia gi tr ny v mt dy bit vi duy nht b bit th 4:

0010 (s thp phn 2)


OR 1000 (s thp phn 8)
1010 (s thp phn 10)

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:

0101 (s thp phn 5)


XOR 0011 (s thp phn 3)
0110 (s thp phn 6)

(cch nh d nht l: 2 bit ging nhau tr v 0, 2 bit khc nhau tr v 1)

Bng chn tr cho XOR:

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:

x:= y xor z; { Pascal }

Cu lnh trn s gp trnh vin hp ng (Assembly) thng s dng ton t XOR gn gi tr ca mt


thanh ghi (register) v 0. Khi thc hin php ton XOR cho mt mu bit vi chnh bn thn n, mu nh
phn nhn c s ton bit 0. Trn nhiu kin trc my tnh, s dng XOR gn 0 cho mt thanh ghi s
c CPU x l nhanh hn so vi chui thao tc tng ng np v lu gi tr 0 vo thanh ghi.

Dch chuyn v quay bit


Cc php dch chuyn bit i khi c xem l cc php ton thao tc bit, bi v chng s xem mt gi tr
di dng mt dy bit hn l di dng s lng s (numerial quantity). Trong cc php ton ny, cc ch
s s c di chuyn, hoc dch chuyn, sang tri hoc phi. Cc thanh ghi trong vi x l my tnh c
di c nh, v vy mt vi bit s b "dch chuyn ra ngoi" thanh ghi mt u, trong khi th mt lng
bit tng ng s c "dch chuyn vo" u cn li; s khc bit cc php ton dch chuyn bit nm
ch cch chng xc nh gi tr ca cc bit c dch chuyn vo.

Dch chuyn s hc

Trong dch chuyn s hc, cc bit c dch chuyn ra khi u hoc ui s b


loi b. Trong php dch chuyn s hc v bn tri, cc s 0 c dch chuyn
vo bn phi; trong php dch chuyn s hc bn phi, bit th hin du c
thm vo bn tri, do du ca s c gi nguyn.

V d di y s dng thanh ghi 8-bit:


Dch chuyn s hc tri
00010111 (s thp phn +23) D ch chuy n tri
= 00101110 (s thp phn +46)

10010111 (s thp phn -105) D ch chuy n phi


= 11001011 (s thp phn -53)

Trng hp u tin, nhng s tn cng bn tri c dch chuyn khi thanh


ghi, mt s 0 mi c thm vo cui bn phi ca thanh ghi. Trng hp th
hai, thnh phn cui bn phi c dch chuyn ra khi, v s 1 c thm Dch chuyn s hc phi
vo bn tri, bo ton c du ca s. Nhiu ln dch chuyn c th c rt
ngn li cn mt ln. V d:

00010111 (s thp phn +23) D ch sang tri 2 l n.


= 01011100 (s thp phn +92)
Dch chuyn s hc bn tri n ln tng ng nhn vi 2n (nu gi tr khng gy trn b nh), trong khi
th php dch chuyn s hc sang phi n ln ca mt gi tr b 2 th tng ng vi vic chia cho 2n v
lm trn v pha m v cng. Nu s nh phn c xem l b 1, th php dch chuyn sang phi tng t s
cho kt qu bng vi vic chia s cho 2n v lm trn v pha 0.

Dch chuyn lun l

Trong dch chuyn lun l, cc s 0 s c dch


chuyn vo thay th cc bit b loi b. Do
dch chuyn lun l v dch chuyn s hc bn tri
l hon ton ging nhau.

Tuy nhin, dch chuyn lun l thm gi tr 0 vo v


tr bit quan trng nht, thay v sao chp bit mang Left logical shift Right logical shift
du, iu ny kh l tng cho cc s nh phn
khng du, trong khi php dch chuyn s hc sang
phi th li l tng cho cc s nh phn b 2 c du.

Quay khng nh

Mt dng khc ca dch chuyn c gi l dch


chuyn vng hay quay bit. Vi php ton ny, cc bit
c xoay ging nh l hai u ca thanh ghi c
gp li vi nhau. Nhng gi tr c dch chuyn
vo bn phi trong mt ln dch chuyn tri chnh
l bt k gi tr no c dch chuyn ra bn
tri, v ngc li. Thao tc ny hu ch nu xy ra
yu cu gi li ton b bit hin thi, v thng Quay tri Quay phi
c s dng trong mt m hc k thut s.

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.

Dch chuyn trong C, C++, C# v Python

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.

Dch chuyn trong Java

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.

Mt vi chi tit v cc ton t dch chuyn 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 .

Dch chuyn trong Pascal

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

Mt v d na l m gii ca php cng, ch ra cch tnh tng ca hai s nguyn a v b s dng cc


ton t thao tc bit v php th s 0:

while a 0
c = b and a
b = b xor a
left shift c by 1
a = c

return b

Lu : cc du = trong cc v d trn l php gn ch khng phi l php tng ng.

Xem thm
Ba Karnaugh

Tham kho

Ly t https://vi.wikipedia.org/w/index.php?title=Php_ton_thao_tc_bit&oldid=26742673

Trang ny c sa i ln cui lc 06:55 ngy 20 thng 7 nm 2017.


Vn bn c pht hnh theo Giy php Creative Commons Ghi cngChia s tng t; c th p
dng iu khon b sung. Vi vic s dng trang web ny, bn chp nhn iu khon S dng v
Quy nh quyn ring t.
Wikipedia l thng hiu ng k ca Wikimedia Foundation, Inc., mt t chc phi li nhun.

You might also like