Библиотека манипулирования битами для ANSI C - PullRequest
5 голосов
/ 24 августа 2009

Кто-нибудь знает хорошую библиотеку битовых манипуляций для ANSI C? Что мне в основном нужно, так это способность, как в Jovial , устанавливать конкретные биты в переменной, что-то вроде

// I assume LSB has index of 0
int a = 0x123;
setBits(&a,2,5, 0xFF);
printf("0x%x"); // should be 0x13F

int a = 0x123;
printf("0x%x",getBits(&a,2,5)); // should be 0x4

char a[] = {0xCC, 0xBB};
char b[] = {0x11, 0x12};
copyBits(a,/*to=*/4,b,/*from=*/,4,/*lengthToCopy=*/8);
// Now a == {0x1C, 0xB2}

Есть похожая библиотека, которая называется bitfile , но, похоже, она не поддерживает прямое манипулирование памятью. Он поддерживает только передачу битов в файловые потоки.

Писать несложно, но если что-то будет проверено - я не буду изобретать велосипед.

Может быть, эта библиотека существует как часть большей библиотеки (bzip2, gzip - обычные подозреваемые)?

Ответы [ 4 ]

7 голосов
/ 24 августа 2009

Я думаю, что это считается "слишком простым" для библиотеки; большинство функций были бы только оператором или двумя, что сделало бы издержки вызова библиотечной функции немного больше, чем допускают типичные программисты на Си. :)

Тем не менее, всегда превосходный glib имеет две из более сложных бит-ориентированных функций: <a href="http://library.gnome.org/devel/glib/stable/glib-Miscellaneous-Utility-Functions.html#g-bit-nth-lsf" rel="noreferrer">g_bit_nth_lsf()</a> и <a href="http://library.gnome.org/devel/glib/stable/glib-Miscellaneous-Utility-Functions.html#g-bit-nth-msf" rel="noreferrer">g_bit_nth_msf()</a>. Они используются для поиска индекса первого установленного бита, поиска по младшему или старшему биту соответственно.

3 голосов
/ 24 августа 2009

Возможно алгоритмы из книги "FXT" (ссылка внизу страницы) будут полезны.

3 голосов
/ 24 августа 2009

Вы пройдете долгий путь со следующими макросами:

#define SETBITS(mem, bits)      (mem) |= (bits)
#define CLEARBITS(mem, bits)    (mem) &= ~(bits)
#define BIN(b7,b6,b5,b4, b3,b2,b1,b0)                      \
(unsigned char)(                                           \
    ((b7)<<7) + ((b6)<<6) + ((b5)<<5) + ((b4)<<4) +        \
    ((b3)<<3) + ((b2)<<2) + ((b1)<<1) + ((b0)<<0)          \
)

Тогда вы можете написать

int a = 0x123;
SETBITS(a, BIN(0,0,0,1, 1,1,1,0));
printf("0x%x", a); // should be 0x13F
2 голосов
/ 24 августа 2009

Кажется, это проблема, с которой я столкнулся в своем вопросе

Алгоритм копирования N битов в произвольной позиции из одного целого в другое

Существует несколько различных альтернатив, наиболее быстрым из которых является сборочное решение от fnieto.

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