Как преобразовать 1 байт и 0,5 байта в 1,5 байта(Более подробно в описании)?

Есть необходимость хранить год, к примеру текущий - 2016. Делается это следующим образом. Число хранится в 16 исчислении - в данном случае это 7E0. Далее для E0 выделяется 1 байт, для 7 выделяется 0,5 байта. И все это записывается в структуру, а затем в файл необходимого формата. Так вот в чем проблема, я считываю эти данные в переменные, и соответственно я вижу их в 10 представлении - 7 и 224. Как мне получить мою дату ?Я предполагаю нужно выделить 2 байта и записать туда их как-то.
  • Вопрос задан
  • 1090 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy
Android developer at Yandex
Во-первых, байт неделим, это вы чушь несёте.
Во-вторых, число хранится не в hex, а в бинарном виде:
2016 == 0b111_11100000
first = 0b111 == 7
second = 224 == 0b11100000
Собственно, вам надо first сдвинуть влево на 8 и прибавить к этому second.
int year = (first << 8) + second;
Тут сложение эквивалентно "логическому или":
int year = (first << 8) | second;
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
гуглить битовые поля. А еще погуглить про выравнивание структур данных.
Ответ написан
Комментировать
Nipheris
@Nipheris Куратор тега C++
Я предполагаю нужно выделить 2 байта и записать туда их как-то.

Вам нужно считать эти два байта как единое целое (например, если вы используете потики, то считать нужно в short int), либо, если это невозможно, то тогда считать байты по отдельности и объединить их в int16_t, как советует Denis Zagayevskiy . И в том и в другом случае вам нужно понимать, что такое порядок байт в записи числа. Когда вы поймете, что такое порядок байт, то поймете, в чем суть вашего вопроса. Следить за ним нужно, т.к. в файле этот порядок байт может быть одним (и он определяется форматом файла), а на вашей машине он, в теории может быть другим, и вам нужно это понимать, когда вы будете склеивать вам int16_t. Если вы не будете его склеивать, а будете считывать сразу в int16_t, то вам нужно сверить порядок байт на вашей архитектуре и в формате файла.

И да, числа в современной выч. технике:
а) хранятся в двоичной системе счисления - т.е. все, что вы видите в дебаггере или в вашей программе - это целиком зависит от того, как функция преобразования числа в строку (которую вы потом видите) выбирает символы для записи числа. В большистве таких функций можно указывать систему счисления. Напишите сами такую функцию,чтобы понять, о чем речь;
б) их размер в памяти/регистрах процессора выровнен на размер байта (как правило это 8 бит). Байт - это квант адресации и обработки данных, поэтому говорить, что число занимает 0.5 байта не вполне корректно с практической точки зрения, т.к. байт занять можно только целиком.

Т.к. про 0.5 байт вы упомянули скорее по ошибке, я думаю битовые поля вам не нужны.
Ответ написан
@neosapient
VC9, VC11, QT4, QT5, MySQL
Скроме структур есть ещё объединения (union)
#pragma pack(push,1)
union{
  int value;
  struct {
    unsigned char b1;
    unsigned char b2;
    unsigned char b3;
    unsigned char b4;
  }
};
#pragma pack(pop)

теперь к каждому байту можно обращаться по имени b1, b2, b3, b4

А в остальном, учите побитовые операции |, &, ^, а так же побитовый сдвиг <<, >>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы