Programowanie i algorytmy

Pola bitowe

powrót

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.

Tworzenie pól bitowych 

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]

Odwoływanie się do pól bitowych

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>
#include<cstdlib>
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;
 
  system("pause");
  return 0;
}
 

 

Out:

Struktura zajmuje 4 bajty pamięci
7
6