2009-08-24 14 views
5

¿Alguien sabe una buena biblioteca de manipulación de bits para ANSI C? Lo que básicamente necesito, es la capacidad, como en Jovial para establecer bits específicos en una variable, algo así comoBiblioteca de manipulación de bits para 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} 

Hay una biblioteca similar llamado bitfile, pero no parece apoyar la manipulación directa de memoria. Solo admite la alimentación de bits a las secuencias de archivos.

No es difícil escribir, pero si hay algo probado, no reinventaré la rueda.

Quizás esta biblioteca exista como parte de una biblioteca más grande (bzip2, gzip son los sospechosos habituales)?

+2

http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-togegle-a-single-bit-in-c Envuelva las respuestas en funciones si es necesario. – dmckee

+0

@dmckee las respuestas allí no incluyen la función 'copyBits'. Y envolver cosas en funciones no es un "deber" en términos generales, pero es imprescindible para un código bien estructurado. –

Respuesta

7

Creo que se considera "demasiado simple" para una biblioteca; la mayoría de las funciones solo serían una declaración o dos, lo que haría que la sobrecarga de llamar a una función de biblioteca sea un poco más de lo que toleran los programadores típicos de C. :)

Dicho esto, el siempre excelente glib tiene dos de las funciones de bits más complicadas: g_bit_nth_lsf() y g_bit_nth_msf(). Estos se usan para encontrar el índice del primer bit establecido, buscando desde el bit más bajo o el más alto, respectivamente.

+1

Acabo de escribirlo, y tomó 15 líneas de código complicado y muchas más pruebas de unidad. Me llevó unas cuantas horas hacerlo, y no veo ninguna ganancia al no proporcionar una biblioteca simple para eso. –

+2

¿De verdad? 'stdbool.h' es bastante simple. – endolith

3

Va recorrido un largo camino con las siguientes macros:

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

entonces usted puede escribir

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

La mitad de una solución. Necesitas una macro GETBIT también. Y un bucle. Publicaré el mío en unos días. –

2

Tal vez el algorithms del libro "FXT" (enlace en la parte inferior de la página) será útil.

Cuestiones relacionadas