Мне не видно простых способов сделать через битовы поля. Проще/надежней сделать массив из байт и функции взять/положить по 3
Но реально, нах такую экономию, округлить размер до 4-х и не ипать моск.
typedef __packed struct ThreeByte_tag{
#define TB_SZ (100)
uint8_t body [TB_SZ * 3];
uint32_t get(int indx){
uint32_t ret = 0;
if (indx >= TB_SZ)
return 0;
ret = body[indx * 3] ;
ret |= body[indx * 3 + 1] << 8;
ret |= body[indx * 3 + 2] << 16;
//ret = 0xFFFFFF & (*(uint32_t* ) (&body[3*indx])); //possible alignment trouble
return ret;
};
void set(int indx, int val){
if (indx >= TB_SZ)
return;
body[indx * 3] = val;
body[indx * 3 + 1] = val >> 8;
body[indx * 3 + 2] = val >> 16;
};
} ThreeByte, *PThreeByte;