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

H m nh phn trong my tnh

nhng bi ton hay v x l bit


Con ngi thng x l nhng bi ton bng h m thp phn, nhng c l h m nh phn li l h m c
a thch hn vi nhng chic my tnh. Trong PC ca bn, cc con s c th hin bng cc bit di dng nh
phn (0,1). Khi chng ta nhp cc con s dui dng thp phn, my s x x l v a v h nh phn di dng
cc bit m chng ta c th tm hiu l 0 v 1. V ch ti khi xut d liu ra (mn hnh hoc tp vn bn), cc s
mi c th hin li dng thp phn. Mi tp trong my thc cht l dng cc byte, trong c nhng byte gi
v tr c bit dng iu khin vic hin th.
Mt s ngi c th hiu t nhiu v bit v cc bi ton x l bit, mt s ngi th khng. Nhng iu khng
phi l quan trng, khi m iu quan trng l chng ta s cp n mt vn tng chng nh rt phc tp
(i vi nhng ngi cha bit nhiu v n), nhng tht ra li tht l n gin m hiu qu li rt cao trong khi x
l nhng bi ton hay v kh. Sau y l nhng thng tin s lc v bit trong PC.
- Trong PC, mi s nguyn u c biu din h nh phn bi mt dy cc bit 0 v 1.
- Cc bit c m s vi nhng s hiu t phi sang tri.
7 6 5 4 3 2 1 0
- 1byte=8bit
- 1word=16bit
- Hm sizeof (x) = s byte ca s nguyn x.
- Cc php ton x l bit:
+ NOT x : php o bit, i cc gi tr trong mi bit ca x t 0->1,1->0.
+ x OR y : Php cng logic trn cc bit.Thc hin trn tng cp bit tng ng ca cc ton hng theo bng sau.

+ x AND y : Php nhn logic trn cc bit. Thc hin trn tng cp bit tng ng ca cc ton hng theo bng sau.

+ x XOR y : Php cng logic trn cc bit.Thc hin trn tng cp bit tng ng ca cc ton hng theo bng sau.

+ x SHR i : Php dch phi, cho gi tr c c t s nguyn x sau khi dch sang phi i bit.
+ x SHL i : Php dch tri, cho gi tr c c t s nguyn x sau khi dch sang tri i bit.
Trn y l mt s php ton lm vic trn cc bit m ta hay dng, trn c s , ta xy dng c mt s hm,
th tc hay dng sau.
- Hm ly bit.
Function LayBit(x:word; i:byte):byte;
Begin
LayBit:=(x SHR i) and 1
End;
Hm tr v gi tr l bit th i ca s nguyn x.
- Th tc bt bit.
Procedure BatBit(Var x:word; i:byte);
Begin
X:=x OR (1 SHL i)
End;
Th tc gn tr 1 cho bit th i trong s nguyn x.
- Th tc tt bit.
Procedure TatBit(Var x:word; i:byte);
Begin
X:=x AND (NOT(1 SHL i))
End;
Th tc gn tr 0 cho bit th i trong s nguyn x.
- Hm Ly s.
Function LaySo(x:word;j,i:byte):byte;
Var
K:byte;
Begin
K:= (8*sizeof(x) - j - 1);
LaySo := (x SHL k) SHR (i+k)
End;
Hm tr v gi tr l s to bi cc bit t tri sang phi, t j -> i ca s x vi iu kin 8*sizeof(x)> j i 0.
Tip n, chng ta s gii quyt mt s bi ton kh hay v x l bit.
Bi ton: Sp xp dy.
Cho tp Data.dat gm cc s nguyn khng m nh hn 500 000 i mt khc nhau. Hy xp tp theo th t tng
dn v a ra tp Result.dat.
Bi ton trn khin ta cm thy kh chu v gii hn d liu ca n, nu ta ngh n vic dng mng lu tr v
xp xp thun tu th qu l ng ngn bi v b nh 64K chng thm thp vo u v ring vic xp xp chim
mc thi gian k lc ri. Ta cng c th dng phng php xp xp ngoi Merge Sort (dng file sp xp), tuy
nhin, y khng phi l gii php hu hiu v vn thi gian. Tuy nhin, phng php sp xp nh du bng
mt vi th thut dng bit th s li cho ta mt kt qu kh l m mn. Ta ch cn dng mt mng A kiu byte vi
khong 63000 phn t l tha x l bi ton ny. Ta tng tng mng A l mt on tu, v mi toa tu l
mt phn t c 8 ch ngi, ch ngi c nh du l 1 nu c ngi ngi, l 0 nu ngc li. Ban u on tu
khng c ngi ngi, ta gn mng bng 0. V vi mi phn t c t file ra, ta nh du bit tng ng trong mng
cho ti khi ht file bng th tc batbit. ly kt qu ghi ra file, ta dng function laybit. Sau y l chng trnh
th hin thut ton:
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S+,T-,V+,X+}
PROGRAM XAP_XEP_DAY_VOI_DU_LIEU_LON;
Const
Datin = 'Data.dat';
Datout = 'Result.dat';
Bt=8;
MAX=63000;
Var
a:array[0..MAX] of byte;
f:text;
Procedure Finish;
Var i,j:longint;
Function LayBit(x,j:longint):byte;
Begin
LayBit:=(x shr j) and 1;
End;
Begin
Assign(f,DATOUT);rewrite(f);
For i:=0 to max do
For j:=0 to bt-1 do
If LayBit(a[i],j)=1 then Write(f,(i*bt+j),' ');
Close(f)
End;
Procedure Start;
Var i,tg:longint;
Procedure BatBit(x,y:longint);
Begin
A[x]:=a[x] or (1 shl y)
End;
Begin
Fillchar(a, sizeof (a), 0);
Assign(f,DATIN);reset(f);
While not seekeof(f) do
Begin
Read(f,tg);
BatBit(tg div bt,tg mod bt)
End;
Close(f)
End;
BEGIN
Start;
Finish
END.
Mt s bi tp tng t.
Bi s 1: Trn tp.
Cho 2 tp In1.dat v In2.dat cha cc s nguyn khng m c th rt ln (khng ln hn 500 000). Hy to tp
Out.dat cha cc s c mt trong 2 tp trn, tuy nhin, khng c trng nhau.
Bi s 2: Ta xu.
Cho file vn bn Str.inp gm nhiu dng, mi dng khng qu 30 k t, ch cha hai k t * v . Hy loi b
bt cc dng ging nhau ri in kt qu ra file Str.out gm cc dng khc nhau.
Bi s 3: M s nhn vin
Tng gim c mt cng ty X ni ting l ngi k lng. ng ta thc hin vic qun l nhn vin
ca mnh bng cch gn cho mi nhn vin mt m s. Cng ty c N nhn vin th mi nhn vin i (i=1,
2,,N) c mt m s. M s l mt s nguyn dng (hai nhn vin khc nhau phi c m s khc nhau).
Do bn i cng tc mt thi gian di nc ngoi nn ng ta giao li quyn qun l cho mt ngi khc.
Khi ng tr v, cng ty c thay i s lng nhn vin, khi tip nhn thm nhn vin mi, ng ta yu
cu mun bit m s nh nht c th gn cho nhn vin mi.
Yu cu:
Cho N m s ca cc nhn vin trong cng ty. Hy tm m s nh nht cha xut hin trong N m s
cho.
D liu vo t tp vn bn CODE.INP
+ Dng u l s N (1<N<=30.000)
+ N dng tip theo, dng th i ghi s ai (i=1..N,
1<=ai<=10
9
)
Kt qu ghi ra tp vn bn CODE.OUT mt s duy
nht l m s tm c
V d ( Hnh bn)
























CODE.INP CODE.OUT
7
6
5
9
1
3
4
2
Mi s t nhin u c th biu din c di dng nh phn. i vi my tnh, cc gi tr s c lu bi cc
bin di dng chui nh phn c di tng ng vi kiu bin .
Trong ngn ng Pascal, mt s kiu ph bin nh:
byte : di 8 BIT
integer : di 2*8 = 16 BIT
longint : di 4*8 = 32 BIT
Cc BIT ca bin c nh s t phi sang tri bt u t 1.
u im ca x l BIT:
1/ B nh: X l BIT c th c dng lm mng nh du. Thay v s dng 1 bin Boolean ch nh du
c 1 phn t l True hay False, ta c th x l BIT nh du 8 BIT tng ng vi 8 phn t.
2/ Tc : Cc php x l BIT c tc nhanh hn cc php x l khc. V d: Hai php (x div 2) v (x shr
1) l nh nhau nhng php (x shr 1) c tc nhanh hn. Trong cc bi ton i hi vic thay i trng thi
nhiu ln th ngi ta vn hay dng x l BIT ci thin tc chng trnh.
Sau y l mt s php x l BIT c bn:
1/ Cng BIT (or):
Kt qu bng tng gi tr 2 BIT. Trng hp 2 BIT u c gi tr bng 1 th kt qu l 1.
V d:
x1 = 9 (00001001)
x2 = 18 (00010010)
x1 or x2 = 27 (00011011)
2/ o BIT (not):
o BIT 0 thnh BIT 1 v BIT 1 thnh BIT 0.
V d:
x1 = 13 (00001101)
not (x1) = 242 (11110010)
3/ Nhn BIT (and):
Kt qu bng tch gi tr 2 BIT.
V d:
x1 = 9 (00001001)
x2 = 12 (00001100)
x1 and x2 = 8 (00001000)
4/ Loi tr BIT (xor):
Kt qu l 0 nu 2 BIT c cng gi tr, l 1 nu 2 BIT khc gi tr.
V d:
x1 = 9 (00001001)
x2 = 18 (00010010)
x1 xor x2 = 27 (00011011)
5/ Dch sang tri k BIT (shl):
V d:
x = 27 (00001101)
x shl 2 = 108 (01101100)
6/ Dch sang phi k BIT (shr):
V d:
x = 27 (00001101)
x shr 2 = 6 (00000110)
T cc php ton trn, ta c cc cng thc m rng sau:
7/ Ly gi tr BIT:
Cho bit BIT th k ca s x c gi tr bao nhiu:
Function GetBIT(k , x : LongInt) : LongInt;
begin
GetBIT := (x shr (k-1)) and 1;
end;
8/ Gn gi tr BIT:
Gn gi tr c cho BIT th k ca s x:

Procedure SetBIT(c , k : LongInt; var x : LongInt);
begin
if c = 1 then x := x or (1 shl (k-1))
else x := x and (not (1 shl (k-1)));
end;
X l s nguyn ln
Posted by basicalgorithm on December 6, 2009
X l s nguyn ln l mt k nng khng th thiu ca mt th sinh tham gia k thi HSGQG. Bi
ton thng lin quan ti vic cng/tr/nhn vi cc s nguyn c nhiu (khong vi trm, vi
nghn) ch s. Bi vit ny xin c cung cp cho cc bn cch thc hin cc php ton vi s nguyn
ln.
1/ tng: Chng ta s thc hin cc php ton ny nh cch lm m hi cp 1 c hc. l thc
hin cc php ton ln lt t phi qua tri v s dng thm mt bin nh.
2/ Khai bo: Cc php ton s c thc hin trn mng, do ta cn xy dng mng 1 chiu c kch thc
l s ch s ti a ca bi ton. Mi phn t ca mng s l 1 ch s. Ngoi ra, cn khai bo bin base l h
c s m chng ta dng khi thc hin cc php ton. Trong v d ny, ti t base = 10 tha mn mi
phn t ch cha 1 ch s.
Const
maxn = 100; // S ch s ti a
base = 10; // H c s khi s dng
Type
BigNum = array[0..maxn] of LongInt; // Kiu s nguyn ln
3/ Php cng:
Function Plus(x , y : BigNum) : BigNum; // Kt qu l s nguyn ln
var
i , nho : LongInt;
begin
Fillchar(Plus , SizeOf(Plus) , 0); // Khi gn Plus = 0
nho := 0; // Khi gn nho = 0
For i := maxn downto 1 do // Cng ln lt tng ch s t phi qua tri
begin
Plus[i] := x[i] + y[i] + nho; // Cng thc cng nh cp 1
nho := Plus[i] div base; // Tnh li bin nho cho ln cng tip theo
Plus[i] := Plus[i] mod base; // m bo mi phn t ch lu mt ch s
end;
end;
phc tp: O(N)
4/ Php tr:
Mt iu ng lu khi thc hin php tr l bin nh ch nhn 1 trong 2 gi tr: 0 hoc 1. Ngoi ra,
m bo kt qu ng, bn cn ch khi ly X Y th X >= Y (c th vit 1 hm kim tra trc khi thc
hin php tr).
Function Minus(x , y : BigNum) : BigNum;
var
i , nho : LongInt;
begin
Fillchar(Minus , SizeOf(Minus) , 0); // Khi gn Minus = 0
nho := 0;
For i := maxn downto 1 do
begin
Minus[i] := x[i] + base y[i] nho; // Cng thm base m bo Minus[i] >= 0
if x[i] < y[i] + nho then nho := 1 else nho := 0; // Tnh li bin nho
Minus[i] := Minus[i] mod base; // m bo mi phn t ch cha 1 ch s
end;
end;
phc tp: O(N)
5/ Php nhn:
Chng ta vn thc hin cch lm nh cp 1: Ly tng ch s ca tha s th hai nhn vi tha s th nht,
c bao nhiu cng vo kt qu. Ch sau mi ln nhn 1 ch s ca tha s th hai vi tha s th nht, ta
cn li kt qu sang tri 1 ch s.
Ngoi ra, s ch s ti a ca kt qu s l tng s ch s ca 2 tha s. V th, ta cn m bo ln cho
kt qu trnh bRangeCheck. Tt nht bn hy khai bo maxn ln bng 2 ln di ti a ca 2 tha s.
Function Multi(x , y : BigNum) : BigNum;
var
i , j , nho : LongInt;
Temp : BigNum;
begin
Fillchar(Multi , SizeOf(Multi) , 0); // Khi gn Multi = 0
nho := 0;
count := -1; // S ch s phi li vo trc khi nhn l -1
For i := maxn downto 1 do
begin
Inc(count); // Tng s lng ch s cn li vo lt nhn th i
Fillchar(Temp , SizeOf(Temp) , 0); // Mng nhn ch s th i ca y vi x
For j := maxn downto (maxn div 2 + 2) do
begin
Temp[j-count] := y[i]*x[j] + nho;
nho := Temp[j-count] div base;
Temp[j-count] := Temp[j-count] mod base;
end;
Minus := Plus(Minus , Temp);
end;
end;
phc tp: O(N^2)
6/ Ci tin:
Khi thc hin php cng/tr, ta nhn thy mi phn t ca kt qu thuc kiu LongInt, c th lu c 9 ch
s. Do , ta c th tbase = 10^9 nhm gim i s lng php tnh. S lng phn t ti a ca
mng BigNum cng gim i ~9 ln.
Tuy nhin, khi in ra, do mi phn t lu 9 ch s nn ta cn in ra c 9 ch s ny (tnh c cc ch s 0 v
ngha u).
Procedure Print;
var
i , j : LongInt;
s : string;
begin
For i := 1 to maxn do
if Res[i] <> 0 then break; // Tm phn t khc 0 u tin ca kt qu
write(Res[i]);
For j := i + 1 to maxn do
begin
str(Res[j] , s); // Chuyn Res[j] sang xu s
while length(s) < 9 do s := 0 + s; // Thm cc ch s 0 vo u m bo 9 ch
s
write(s);
end;
end;

You might also like