Бих запазил вашите данни в 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