В этом вопросе для простоты предположим, что все целые числа не подписаны.
Предположим, я хотел бы написать 2 функции, упаковывать и распаковывать, которые позволят вам упаковать целые числа меньшей ширины, скажем, в 64-битное целое число. Тем не менее, расположение и ширина целых чисел указываются во время выполнения, поэтому я не могу использовать битовые поля C.
Быстрее всего объяснить на примере. Для простоты я проиллюстрирую это с помощью 8-битных целых чисел:
* *
bit # 8 7 6 5 4 3 2 1
myint 0 1 1 0 0 0 1 1
Предположим, я хочу "распаковать" в месте 5 целое число ширины 2. Это два бита, отмеченные звездочкой. Результат этой операции должен быть 0b01. Аналогично, если я распакую в месте 2 шириной 6, я получу 0b100011.
Я могу легко написать функцию распаковки с помощью сдвига влево, а затем сдвига вправо.
Но я не могу придумать ясного способа написать эквивалентную функцию «pack», которая будет делать обратное.
Скажем, учитывая целое число 0b11, упаковка его в myint (сверху) в местоположении 5 и ширине 2 даст
* *
bit # 8 7 6 5 4 3 2 1
myint 0 1 1 1 0 0 1 1
Лучшее, что я придумал, включает в себя множество конкатенирующих битовых строк с OR, << и >>. Перед тем, как реализовать и протестировать его, может быть, кто-нибудь найдет умное быстрое решение?