В C вы можете сдвигать биты в обоих направлениях, используя a >> b
или a << b
, где a - число сдвига, а b - количество сдвигов. Вставленные биты будут равны 0 с.
В вашем случае, это было бы
unsigned int time=0;
time |= year;
time |= month << 12;
time |= day << 16;
Чтобы распаковать его, вы просто должны смещаться time
в другом направлении и &
его к числу разыскиваемых битов:
int year = time & 0b111111111111;
int month = (time >> 12) & 0b1111;
int day = (time >> 16) & 0b11111;
EDIT
Если Вы хотите, чтобы данные, которые можно заказать из наиболее значащего бита и складывали на него
например:
11111111111111111111100000000000
\___________|___|___/
year month day
вам просто нужно перенести данные соответственно
ПАК:
short int_length = sizeof(unsigned int); //usually 32
unsigned int time=0;
time |= year << (int_length - 12);
time |= month << (int_length - 16);
time |= day << (int_length - 21);
UNPACK:
short int_length = sizeof(unsigned int); //usually 32
int year = (time >> (int_length - 12)) & 0b111111111111;
int month = (time >> (int_length - 16)) & 0b1111;
int day = (time >> (int_length - 21)) & 0b11111;
Если вы хотите, чтобы данные, которые можно заказать из наиболее значащего бита и складывали в наименее значащий бит
например:
00000000000111111111111111111111
\___________|___|___/
year month day
Используйте вместо этого
PACK:
unsigned int time=0;
time |= year << 9;
time |= month << 5;
time |= day;
UNPACK:
int year = (time >> 9) & 0b111111111111;
int month = (time >> 5) & 0b1111;
int day = time & 0b11111;
Подробнее о битовых операторах. – Olaf
Сдвиг для выравнивания каждого поля. –
или использовать бит-поле – BLUEPIXY