2009-08-24 13 views
5

Czy ktoś zna dobrą bibliotekę manipulacji dla ANSI C? Co ja w zasadzie potrzebne, jest możliwość, podobnie jak w Jovial ustalenie konkretnych bitów w zmiennej, coś jakBiblioteka manipulacji bitami dla ANSI C

// 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} 

Jest podobna biblioteka nazywa bitfile, ale nie wydaje się, aby wspierać bezpośrednią manipulację pamięci. Obsługuje tylko bity podające do strumieni plików.

Nie jest trudno napisać, ale jeśli jest coś przetestowanego - nie wymyślę na nowo koła.

Może ta biblioteka istnieje jako część większej biblioteki (bzip2, gzip to zwykle podejrzani)?

+2

http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c Owiń w odpowiedzi funkcje, jeśli musisz. – dmckee

+0

@dmckee odpowiedzi tam nie zawierają funkcji 'copyBits'. I owijanie rzeczy w funkcje nie jest "koniecznością" ogólnie rzecz biorąc, ale jest koniecznością dla dobrze zorganizowanego kodu. –

Odpowiedz

7

Myślę, że jest uważany za "zbyt prosty" dla biblioteki; większość funkcji byłaby tylko instrukcją lub dwiema, co spowodowałoby, że narzut wywoływania funkcji bibliotecznej byłby nieco bardziej niż tolerowany przez typowych programistów C. :)

Powiedziawszy to, zawsze znakomity glib ma dwie z bardziej skomplikowanych funkcji bitowych: g_bit_nth_lsf() i g_bit_nth_msf(). Są one używane do znalezienia indeksu pierwszego zestawu bitów, wyszukując, odpowiednio, od najniższego lub najwyższego bit.

+1

Właśnie napisałem to, i zajęło 15 linii trudnego kodu i wiele więcej testów jednostkowych. Zajęło mi to sporo czasu i nie widzę żadnego pożytku z tego, że nie udostępniam prostej biblioteki. –

+2

Naprawdę? 'stdbool.h' jest całkiem proste. – endolith

3

Będzie długą drogę z następujących makr:

#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)   \ 
) 

Następnie można napisać

int a = 0x123; 
SETBITS(a, BIN(0,0,0,1, 1,1,1,0)); 
printf("0x%x", a); // should be 0x13F 
+3

Pół rozwiązania. Potrzebujesz również makra GETBIT. I pętla. Za kilka dni opublikuję. –

2

Może algorithms z książki „FXT” (link na dole strony) będzie użyteczne.