2009-08-24 12 views
5

Qualcuno conosce una buona libreria di manipolazione bit per ANSI C? Quello che fondamentalmente bisogno, è la capacità, come in Jovial per impostare i bit specifici in una variabile, qualcosa comeLibreria manipolazione bit per 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} 

C'è una biblioteca simile chiamato bitfile, ma non sembra supportare la manipolazione della memoria diretta. Supporta solo l'alimentazione dei bit per i flussi di file.

Non è difficile scrivere, ma se c'è qualcosa di testato, non reinventerò la ruota.

Forse questa libreria esiste come parte di una libreria più grande (bzip2, gzip sono i soliti sospetti)?

+2

http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c Se necessario, avvolgi le risposte nelle funzioni. – dmckee

+0

@dmckee le risposte non includono la funzione 'copyBits'. E avvolgere le cose nelle funzioni non è un "must" in generale, ma è un must per un codice ben strutturato. –

risposta

7

Penso che sia considerato "troppo semplice" per una biblioteca; la maggior parte delle funzioni sarebbe solo una dichiarazione o due, il che renderebbe il sovraccarico di chiamare una funzione di libreria un po 'più di quanto tollerino i tipici programmatori C. :)

Detto questo, il sempre eccellente glib ha due delle più complicate funzioni orientate ai bit: g_bit_nth_lsf() e g_bit_nth_msf(). Questi sono usati per trovare l'indice del primo bit impostato, cercando rispettivamente dal bit più basso o più alto.

+1

L'ho appena scritto e ci sono volute 15 righe di codice complicato e molti altri test unitari. Mi ci sono volute alcune ore per farlo, e non vedo alcun guadagno se non fornisco una semplice libreria per questo. –

+2

Davvero? 'stdbool.h' è abbastanza semplice. – endolith

3

Si percorso una lunga strada con le seguenti macro:

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

Quindi è possibile scrivere

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

Mezza soluzione. Hai bisogno anche di una macro GETBIT. E un ciclo. Inserirò il mio in pochi giorni. –

2

Forse il algorithms dal libro "FXT" (link in fondo alla pagina) sarà utile.