Ky Thuat Xu Li Bit Trong Pascal

download Ky Thuat Xu Li Bit Trong Pascal

of 10

Transcript of Ky Thuat Xu Li Bit Trong Pascal

  • 7/21/2019 Ky Thuat Xu Li Bit Trong Pascal

    1/10

    H m nh phn trong my tnhnhng 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 ca thch hn vi nhng chic my tnh. Trong PC ca bn, cc con s c th hin bng cc bit di dng nhphn (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 dngcc 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 smi c th hin li dng thp phn. Mi tp trong my thc cht l dng cc byte, trong c nhng byte giv 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 khngphi 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 xl 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.

  • 7/21/2019 Ky Thuat Xu Li Bit Trong Pascal

    2/10

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

  • 7/21/2019 Ky Thuat Xu Li Bit Trong Pascal

    3/10

    Tip n, chng ta s gii quyt mt s bi ton khhay 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 tngdn 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 vxp 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), tuynhin, y khng phi l gii php hu hiu v vn thi gian. Tuy nhin, phng php sp xp nh du bngmt vi th thut dng bit th s li cho ta mt kt qu kh l mmn. Ta ch cn dng mt mng A kiu byte vikhong 63000 phn t l tha x l bi ton ny. Ta tng tng mng A l mt on tu, v mi toa tu lmt phn t c 8 ch ngi, ch ngi c nh du l 1 nu c ngi ngi, l 0 nu ngc li. Banu on tukhng c ngi ngi, ta gn mng bng 0. V vi mi phn t c t file ra, ta nh du bit tng ng trong mngcho ti khi ht file bng th tc batbit. ly kt qu ghi ra file, ta dng function laybit. Sau y l chng trnhth 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),' ');

  • 7/21/2019 Ky Thuat Xu Li Bit Trong Pascal

    4/10

    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 tpOut.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, midng khng qu 30 k t, ch cha hai k t * v . Hy loi bbt cc dng ging nhau ri in kt qu ra file Str.out gm cc dng khc nhau.

    Bi s 3:M s nhn vin

  • 7/21/2019 Ky Thuat Xu Li Bit Trong Pascal

    5/10

    Tng gim c mt cng ty X ni ting l ngi k lng. ng ta thc hin vic qun l nhn vinca 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 yucu mun bit m s nh nht c th gn cho nhn vin mi.

    Yu cu:

    Cho N m s cacc 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

  • 7/21/2019 Ky Thuat Xu Li Bit Trong Pascal

    6/10

    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 qul 1.

    V d:

    x1 = 9 (00001001)

    x2 = 18 (00010010)

    x1 or x2 = 27 (00011011)

    2/ o BIT (not):

    o BIT0thnh BIT 1v BIT 1thnh 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 l0nu 2 BIT c cng gi tr, l1nu 2 BIT khc gi tr.

    V d:

    x1 = 9 (00001001)

    x2 = 18 (00010010)

    x1 xor x2 = 27 (00011011)

  • 7/21/2019 Ky Thuat Xu Li Bit Trong Pascal

    7/10

    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 thkca sxc 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 trccho BIT thkca sx:

    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 nguynln

    Posted bybasicalgorithmon December 6, 2009

    X l s nguyn ln l mt k nng khng th thiu ca mt th sinh tham gia k thi HSGQG. Biton 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 binbasel hc s m chng ta dng khi thc hin cc php ton. Trong v d ny, ti tbase = 10 tha mn mi

    phn t ch cha 1 ch s.

    http://basicalgorithm.wordpress.com/http://basicalgorithm.wordpress.com/http://basicalgorithm.wordpress.com/http://basicalgorithm.wordpress.com/
  • 7/21/2019 Ky Thuat Xu Li Bit Trong Pascal

    8/10

    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 nhn1trong 2gi tr:0hoc1. Ngoi ra,

    m bo kt qu ng, bn cn ch khi lyX Yth 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)

  • 7/21/2019 Ky Thuat Xu Li Bit Trong Pascal

    9/10

    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 ltng s ch s ca 2 tha s. V th, ta cn m bo ln cho

    kt qu trnh bRangeCheck. Tt nht bn hy khai bomaxnln 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 -1For 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 kiuLongInt, c th lu c 9 ch

    s. Do , ta c th tbase = 10^9nhm gim i s lng php tnh. S lng phn t ti a ca

    mngBigNumcng 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

  • 7/21/2019 Ky Thuat Xu Li Bit Trong Pascal

    10/10

    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 chs

    write(s);

    end;

    end;