Структуре од битова¶
Још један од начина да се уштеди меморија у C програмима су поља битова. Најмањи целобројни тип податка је char
који заузима један бајт, а за представљање неких података довољан је мањи број битова.
Структуре од битова су структуре чија су поља дужине неколико битова. Најчешће
се користе за описивање структуре разних хардверских регистара рачунара.
Програми нису преносиви са рачунара на рачунар и зато се не препоручује ова
употреба структура. Пољима се приступа преко .
и ->
и није дозвољена
употреба &
јер поља немају адресу.
На пример ако желимо да представимо семафор то можемо урадити структуром само са три бита. У нормалној структури било би нам потребно најмање три бајта ако користимо пормењиве типа char
. Синтакса се разликује у односу на синтаксу стандардне структутре.
Иза сваке променљиве након :
наводи се број битова који је потребан да се одвоји за ту променљиву. Поља морају да буду типа int
експлицитно unsigned
илиsigned
. Поља се понашају као и други мали цели бројеви и могу да учествују у аритметичким изразима као и било који други цео број.
Пример 1:
#include <stdio.h>
#include <string.h>
struct
{
unsigned int crveno: 1;
unsigned int zuto: 1;
unsigned int zeleno: 1;
}semafor;
int main( void)
{
semafor.crveno = 1;
semafor.zuto = 1;
semafor.zeleno = 0;
if (semafor.crveno == 1 && semafor.zuto == 0 && semafor.zeleno == 0)
{
printf("Sacekaj ");
}
else
{
printf("Kreni ");
}
return 0;
}
Излаз:
Kreni
У овом примеру дефинише се промењива semafor
која има три поља, која укупно заузимају три бита који представљају светла црвено, жуто и зелено. Вредност 1
неког светла означава да је светло укључено а 0
да је искључено. Паковање битова приликом доделе вредности пољима односно распакивање приликом узимања вредности поља врши се аутоматски.
Програмер не треба да се мучи наредбама за манипулисање битовима да би то обезбедио.
Структура од битова може се дефинисати и на класичан начин.
Пример 2:
#include <stdio.h>
#include <string.h>
struct semafor
{
unsigned int crveno: 1;
unsigned int zuto: 1;
unsigned int zeleno: 1;
};
int main( void)
{
struct semafor sem;
sem.crveno = 1;
sem.zuto = 1;
sem.zeleno = 0;
if (sem.crveno == 1 && sem.zuto == 0 && sem.zeleno == 0)
{
printf("Sacekaj ");
}
else
{
printf("Kreni ");
}
return 0;
}
Излаз:
Kreni