У вас, кажется, слишком мало битов, назначенных на Месяц (0xc00), и как вы это делаете, нелегко увидеть, верны ли ваши смены.
Я бы посоветовал определить ваши константы более согласованным образом:
#define DAY_BITS 5
#define MONTH_BITS 4
#define YEAR_BITS 7
#define DAY_OFFSET YEAR_BITS
#define MONTH_OFFSET ( YEAR_BITS + DAY_BITS )
#define YEAR_OFFSET 0
#define DAY_MASK ~( ~0 << DAY_BITS )
#define MONTH_MASK ~( ~0 << MONTH_BITS )
#define YEAR_MASK ~( ~0 << YEAR_BITS )
... теперь вы можете установить упакованное значение следующим образом:
packed = 0;
packed |= ( day & DAY_MASK ) << DAY_OFFSET;
packed |= ( month & MONTH_MASK ) << MONTH_OFFSET;
packed |= ( year & YEAR_MASK ) << YEAR_OFFSET;
... и получите такие поля, как это:
printf("\tDay\t\t%d \n", ( packed >> DAY_OFFSET ) & DAY_MASK );
printf("\tMonth\t\t%d \n", ( packed >> MONTH_OFFSET ) & MONTH_MASK );
printf("\tYear\t\t%d \n", ( packed >> YEAR_OFFSET ) & YEAR_MASK );
Теперь вы можете просто изменить порядок полей в определениях смещений, чтобы упростить сортировку дат:
#define DAY_OFFSET 0
#define MONTH_OFFSET DAY_BITS
#define YEAR_OFFSET ( DAY_BITS + MONTH_BITS )