Упаковка нескольких целых чисел в 64-битное целое

Я хочу упаковать следующие числа в 64-битное поле int64_t в следующем порядке:

  • int8_t число1
  • int8_t число2
  • int32_t число3
  • int16_t число4

Итак, 64 бита должны быть в следующей раскладке:

[  num1(8)  |  num2(8)  |       num3(32)       |   num4(16)  ]

Я не могу понять логику упаковки битов, т.е. я хочу, чтобы эти числа были упакованы в одно поле int64_t, подобное этот вопрос.

Любая помощь приветствуется.


person jeffreyveon    schedule 10.11.2017    source источник
comment
Я не могу понять логику упаковки битов. это не вопрос. В чем именно ваша проблема?   -  person Baum mit Augen    schedule 10.11.2017
comment
Я хочу, чтобы эти числа были упакованы в одно поле int64_t, подобное: 32-битные целые числа и обратное преобразование" title="как сохранить 64-битное целое число в два 32-битных целых числа и снова преобразовать"> stackoverflow.com/questions/2810280/   -  person jeffreyveon    schedule 10.11.2017
comment
Это редактирование не делает его лучше. Вы пробовали что-то? Что пошло не так? Укажите конкретное описание проблемы.   -  person Baum mit Augen    schedule 10.11.2017
comment
Одна вещь, которую я видел, - это объединение int64 и структуры, содержащей отдельные поля. Просто будьте осторожны с порядком и порядком байтов.   -  person 0x5453    schedule 10.11.2017
comment
число = (число1‹‹56 | (число2‹‹48) | (число3‹‹16) | число4)   -  person arminb    schedule 10.11.2017
comment
@ 0x5453 Это тоже UB, по крайней мере, на C++.   -  person Baum mit Augen    schedule 10.11.2017
comment
С или С++? Выбери один.   -  person underscore_d    schedule 10.11.2017
comment
@arminb И это тоже UB. Вы уже сделали предположения? :/   -  person Baum mit Augen    schedule 10.11.2017
comment
Вы продолжаете говорить, что это UB, но какая часть не определена? (действительно любопытно)   -  person byxor    schedule 10.11.2017
comment
@byxor Вы не можете каламбурить через союзы, а переполнение целого числа со знаком - это UB.   -  person Baum mit Augen    schedule 10.11.2017
comment
@BaummitAugen Обозначение типов через союзы кажется нормальным в C, но не в C++, поэтому ОП должен выбрать один язык, о котором нужно спросить.   -  person underscore_d    schedule 10.11.2017
comment
Действительно ли все эти целые числа должны быть подписаны? Необходимость беспокоиться о продлении вывески усложняет жизнь...   -  person Useless    schedule 10.11.2017
comment
Сообщить нам, чего вы хотите, — это не вопрос и не описание проблемы. Что вы пробовали до сих пор и где это терпит неудачу?   -  person Gerhardh    schedule 10.11.2017
comment
@ 0x5453 вы забыли упомянуть отступы в своем списке заботы о .. . ;)   -  person Gerhardh    schedule 10.11.2017
comment
Да, и забыл спросить: эти поля тоже нужно распаковывать или это односторонняя операция?   -  person Useless    schedule 10.11.2017


Ответы (1)


Вы, вероятно, хотите этого:

  int8_t num1;
  int8_t num2;
  int32_t num3;
  int16_t num4;
  ...
  uint64_t number = ((uint64_t)num1 << (16 + 32 + 8)) | ((uint64_t)num2 << (16 + 32)) | ((uint64_t)num3 << 16) | (uint64_t)num4;

Из этого вы должны понять, как выполнить обратное преобразование. Если нет, задайте другой вопрос.

person Jabberwocky    schedule 10.11.2017