Feladatok‎ > ‎

Bitfaragás

Gondolkoztál azon, hogy néha mennyire pazarlóan bánunk a memóriával?

Vegyük például a következő feladatot: számon kell tartanunk a hét egy ezredmásodpercét. Az első ötlet:

// Szerda 14:12:59.87
int nap = 2; // 0-6 (H-V)
int ora = 14; // 0-59
int perc = 12; // 0-59
int mp = 59; // 0-59
int szazad = 87; // 0-100

Mindegyik változót egy int-ként ábrázoljuk. Egy int 32 bites, tehát 2^32=4294967296 féle értéke lehet. Ez elég nagy pazarlás ahhoz képest, hogy hányféle értéket vehetnek fel a változók.

Ezzel szemben próbáljuk meg egyetlen intben eltárolni a fenti információt! Vegyük figyelembe, hogy mekkora a változóink értékkészlete. Legkevesebb hány bit kell ahhoz, hogy elférjen benne a nap/ora/...?

nap:   0-6    < 8    =2^3    3 bit
ora:   0-23   < 32   =2^5    5 bit
perc:  0-59   < 64   =2^6    6 bit
mp:    0-59   < 64   =2^6    6 bit
ezred: 0-999  < 1024 =2^10  10 bit
                            ======
                            30 bit

30 biten kényelmesen elfér ennyi információ. Ezért egy int-ben elfér mindez, ötödannyi memóriát felhasználva:

00NNNOOO OOPPPPPP MMMMMMEE EEEEEEEE

Készíts egy függvényt, ami 5 int paraméterben kapott nap, ora, perc, mp, ezred változókat összefaragja, és visszatér az így kapott kompakt int-tel.

Egy másik függvény oldja fel a tömörítést, egy kompakt int-et szétdarabol, és kiírja a standard outputra az 5 számot.

Hasznos lehet