Я бы держал ваши данные в 3 байтах как
- первый байт = год
- второй байт = месяц
- третий байт = день
В каждом байте достаточно места для домена каждого поля (год, месяц, день). Вы можете записать их в виде целого числа с операциями побитового сдвига, например:
int year = 13;
int month = 7;
int day = 26;
int my_date = (year << 16) | (month << 8) | day;
Редактировать:
Что я сделал в my_date: я в основном объединил необходимую информацию (год, месяц, день) в серию битов (8 битов на информационное поле) в виде целого числа. Вы знаете, что int
составляет 4 байта. Учтите для начала, что my_date
равно 0, то есть все 32 бита равны 0. 4 его байта выглядят следующим образом ("|" обозначает конкатенацию; это для простоты чтения):
my_date = 0 | 0 | 0 | 0
Когда я пишу year << 16
у меня
year << 16 = 0 | year | 0 | 0
Подобным образом,
month << 8 = 0 | 0 | month | 0
day = 0 | 0 | 0 | day
Когда я применяю оператор OR ко всем из них, my_date выглядит так:
my_date = 0 | year | month | day
Доступ к ним:
year = (my_date & 0xFF0000) >> 16;
month = (my_date & 0xFF00) >> 8;
day = my_date & 0xFF;
Изменить: как работает доступ. У нас раньше было
my_date = 0 | year | month | day
Если вы сделаете, например, И с 0xFF00, что равно 0 | 0 | FF | 0
, вы получите
my_date & 0xFF00 = 0 | 0 | month | 0
Теперь все, что вам нужно сделать, это перенести ваши данные обратно, так что
(my_date & 0xFF00) >> 8 = 0 | 0 | 0 | month = month
Надеюсь, теперь стало понятнее.
person
webuster
schedule
08.02.2014