Как уже упоминалось, вам может быть легче работать с битовым полем, чем сдвигом и или для выравнивания битов. Битовое поле объявляется как обычная структура, но позволяет разделять биты между членами структуры. Для года, месяца, дня вы можете использовать что-то вроде:
typedef struct { /* bitfield for year, month, day */
unsigned year : 11,
mon : 4,
day : 4;
} datebits;
Структура datebits
выделяет первые 11 бит для года, следующие 4 для месяца и последние 4 для дня. Вы используете его так же, как и любую другую структуру. Вот краткий пример:
#include <stdio.h>
typedef struct { /* bitfield for year, month, day */
unsigned year : 11,
mon : 4,
day : 4;
} datebits;
typedef union { /* union to avoid violating strict aliasing */
datebits d; /* when shifting datebits to print binary bits */
unsigned u; /* (this is only for putchar bit output) */
} duu;
int main (void) {
unsigned i = 19;
datebits d; /* declare bitfield */
duu du;
d.year = 1999; /* fill bitfield */
d.mon = 12;
d.day = 2;
du.d = d;
printf ("\n year : %u month : %u day : %u\n\n (bits in memory) d : ",
d.year, d.mon, d.day);
while (i--) /* verification of each bit in memory */
putchar ((du.u >> i) & 1 ? '1' : '0');
putchar ('\n');
return 0;
}
Вывод
$ ./bin/bitfield_datebits
year : 1999 month : 12 day : 2
(bits in memory) d : 0010110011111001111
(примечание: объединение предназначено только для облегчения двоичной печати отдельных битов, оно не требуется для нормального использования datebits
).
Как видите, ваш день 0010
, месяц 1100
и год 11111001111
в правильном порядке.
person
David C. Rankin
schedule
23.02.2016