next up previous contents
Elõre: A union fogalma Fel: Struktúrák és unionok Vissza: Hivatkozás struktúra elemekre

A bitmezõk

A struktúrák egy másik felhasználási területe, hogy segítségükkel felbonthatunk sorszámozott típusú adatokat char-nál is rövidebb bithosszúságú részekre. Ily módon még arra is van lehetõségünk, hogy egy int értéknek minden egyes bitjét külön-külön kezelhessük. Az ilyen, bithosszban meghatározott elemek neve bitmezõ (bitfield), és hosszukra az egyetlen megkötés, hogy minden bitmezõnek el kell férni egy int tárolására szolgáló területen. Használatuknak akkor van jelentõsége, ha nagy mennyiségû jelzõt (flag-et) szeretnénk minél tömörebben tárolni, vagy ha hardverközeli programozásban az egyes biteknek, bitcsoportoknak különálló funkciója van, és egymástól függetlenül kívánjuk ezeket használni. Jóllehet, ez a lehetõség eddig is rendelkezésünkre állt, hiszen a bitenkénti operátorokkal tetszõleges bitet kiválaszthattunk, beállíthattunk illetve törölhettünk, de a bitmezõk használata ugyanerre kényelmesebb és jobban követhetõ lehetõséget biztosít. A bitmezõket formailag struktúraelemként kell definiálni és használni, az egyetlen eltérés az, hogy a bitmezõk azonosítóját kettõsponttal ( :) elválasztva a bitben kifejezett hossz megadása követi:

tárolási osztály spec.struct típuscímke

       {

        típus_1  azonosító_1 : hossz_1;

        típus_2  azonosító_2 : hossz_2;

            ...

       } azonosítólista;

A bitmezõk típusa int, vagy unsigned int lehet. Eredetileg a bitmezõket elõjel nélkülinek tervezték, függetlenül a megadott típustól; a BORLAND C++ azonban az int-ként definiált bitmezõket elõjeles mennyiségként kezeli. Mindaddig, amíg az egymás után következõ bitmezõk elférnek egy gépi szóban, a fordító ezeket egy (unsigned vagy signed) int-be pakolja, egyébként újat kezd. Lehetnek meg nem nevezett bitmezõk is, csak :-ból és hosszból felépítve, a nem használt helyek kitöltésére. A 0 speciális hosszmegadás befejezi az adott gépi szó bitmezõkkel való feltöltését, és újat kezd. Például:

            struct bitmezo {
                             int      mezo_1 : 1,
                                      mezo_2 : 2;
                             unsigned mezo_3 : 8,
                                      mezo_4 : 8;
                             int             : 0,
                                      mezo_5 : 2;
                           } bm;
Egy szóba kerülnek a mezo_1, a mezo_2 és a mezo_3. A mezo_4 már nem fér itt el, ezért új szóban helyezkedik el. A mezo_5 is elférne még ugyanitt, de a 0 szélességû bitmezõ használatával azt egy harmadik szóba kényszerítettük. Példák bitmezõk használatára:
            bm.mezo_3 = 'X';  bm.mezo_5 = bm.mezo_2;
            bm.mezo_4 = bm.mezo_1 ? 0 : bm.mezo_3;