«Динамическое битовое поле» в C - PullRequest
1 голос
/ 01 марта 2011

В этом вопросе для простоты предположим, что все целые числа не подписаны.

Предположим, я хотел бы написать 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, << и >>. Перед тем, как реализовать и протестировать его, может быть, кто-нибудь найдет умное быстрое решение?

1 Ответ

5 голосов
/ 01 марта 2011

Вне моей головы, не проверено.

int pack(int oldPackedInteger, int bitOffset, int bitCount, int value) {
    int mask = (1 << bitCount) -1;
    mask <<= bitOffset;
    oldPackedInteger &= ~mask;
    oldPackedInteger |= value << bitOffset;
    return oldPackedInteger;
}

В вашем примере:

int value = 0x63;
value = pack(value, 4, 2, 0x3);

Чтобы записать значение «3» со смещением 4 (с двумя битамидоступно), когда 0x63 является текущим значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...