En jouant avec les opérateur bit à bit ça devrait être assez simple .
Exemple vite fais pour enregistré une valeur à la fois, juste changer le jours par exemple, etc. (avec l'année bissextile ça fait pile 16 bit)
unsigned int date;
date &= 0xFFE0; (1111 1111 1110 0000)
date += month;
date &= 0xFE1F; (1111 1110 0001 1111)
date += (day << 5);
date &= 0x81FF; (1000 0001 1111 1111)
date += (year << 9);
date &= 0x81FF; (0111 1111 1111 1111)
date += (bisexYear << 15);
.
.
.
date &= 0x81E0; (1000 0001 1110 0000)
date += (month+(year << 9)); // juste le mois et l'année
date = month+(day << 5)+(year << 9)+(bisexYear << 15); //tout en 1 coup
pour les deux premier octet ça sera simple, pour les 54 autres

.
Peut être utilisé 5 octet (2 variable int + 1byte) par structure comme le propose
Super_Cinci donc 40 bit (2 de perdu ou autre chose à ajouter, retenir ?) comme tu en as besoin de 38.
day+month+year+bisexYear : 2 octet (int dont 16bit occupé)
hour + minute + dayofWeek : 2 octet (int dont 14 bit occupé)
second + daysinMonth : 1 octet (byte dont 8bit occupé)
second ne serait pas dans le deuxième int pour facilité le travail comme l'ensemble de l'heure fais 17bit, mais bon il serait au début du 3 ième (byte) et entier.
La structure sur laque tu travaillerais.
struct date
{
uint16_t champ1;
uint16_t champ2;
uint8_t champ3;
};
date dates[11];