Oprócz zwykłych pól w strukturach możemy zastosować tak zwane pola bitowe. Pole bitowe to wydzielenie pewnej stałej porcji bitów na daną zmienną. Na przykład zmienna typu char zajmuje w pamięci 1 bajt = 8 bitów. Możemy ją okroić lub rozszerzyć o porcję bitów dostosowaną do potrzeb programu.
Pamięć jaką będzie zajmować takie pole będzie zawsze krotnością bajtów danego typu zmiennej. Np. jeśli stworzymy pole typu int na 4 bity, to i tak zostanie przydzielona pamięć na cały typ int czyli 4 bajty = 32 bity, a używać będziemy mogli tylko tych czterech bitów.
Więc gdzie tu oszczędność?
Gdy stworzymy na przykład pięć pól bitowych typu int, i każde będzie zajmowało 6 bitów, to w pamięci zostanie zarezerwowany obszar na jeden int, czyli 32 bity, ponieważ 5*6 = 30 ≤ 32, i właśnie tu mamy oszczędność pamięci.
Pola te tworzymy zgodnie z zasadą:
typ nazwa : [ilość bitów];
np.
int pole_bitowe : 4; //pole bitowe na czterech bitach
Zakres wartości danych takiego pola wynosi:
[-23, 23-1] a więc [-8, 7]
Do takich elementów struktury odwołujemy się tak samo jak do innych jej pól, czyli za pomocą kropki lub "->" w przypadku wskaźników. Poniżej zademonstrowano przykładowe wykorzystanie pól bitowych:
#include<iostream>
using namespace std;
struct pola_bitowe{
int a:4;
int b:4;
};
int main()
{
pola_bitowe x;
cout<<"Struktura zajmuje "<<sizeof(x)<<" bajty pamięci\n"; //cztery bajty, tyle ile jeden int
x.a = 7; //maksymalna wartosć dodatnia jaką możemy nadać dla typu int na 4 bitach
cout<<x.a<<endl;
x.a--; //pola bitowe możemy inkrementować i dekrementować tak jak zmienne typu int
cout<<x.a<<endl;
return 0;
}
Out:
Struktura zajmuje 4 bajty pamięci 7 6