¿Cómo implemento una matriz de bits en C / Objective C?

iOS / Objective-C: Tengo una gran variedad de valores booleans.

Esta es una forma ineficiente de almacenar estos valores: se utilizan al less ocho bits para cada elemento cuando solo se necesita uno.

¿Cómo puedo optimizar?

ver CFMutableBitVector / CFBitVector para una opción CFType

Prueba esto:

#define BITOP(a,b,op) \ ((a)[(size_t)(b)/(8*sizeof *(a))] op ((size_t)1<<((size_t)(b)%(8*sizeof *(a))))) 

Entonces, para cualquier matriz de elementos integers sin signo no mayor que size_t , la macro BITOP puede acceder a la matriz como una matriz de bits. Por ejemplo:

 unsigned char array[16] = {0}; BITOP(array, 40, |=); /* sets bit 40 */ BITOP(array, 41, ^=); /* toggles bit 41 */ if (BITOP(array, 42, &)) return 0; /* tests bit 42 */ BITOP(array, 43, &=~); /* clears bit 43 */ 

etc

Utiliza las operaciones lógicas a bit y el desplazamiento de bits. (Una búsqueda en Google de estos términos podría brindarte algunos ejemplos).

Básicamente declaras un tipo integer (incluyendo int , char , etc.), luego "cambias" los valores integers a la bit que deseas, entonces haces un OR o un AND con el integer.

Algunos ejemplos ilustrativos rápidos (en C ++):

 inline bool bit_is_on(int bit_array, int bit_number) { return ((bit_array) & (1 << bit_number)) ? true : false; } inline void set_bit(int &bit_array, int bit_number) { bit_array |= (1 << bit_number); } inline void clear_bit(int &bit_array, int bit_number) { bit_array &= ~(1 << bit_number); } 

Tenga en count que esto proporciona "matrices de bits" de tamaño constante ( sizeof(int) * 8 bits). Tal vez eso está bien para ti, o tal vez querrás build algo encima de esto. (O reutilice lo que proporciona alguna biblioteca).

Esto utilizará less memory que las matrices bool … SIN EMBARGO … El código que genera el comstackdor para acceder a estos bits será mayor y más lento. Entonces, a less que tenga una gran cantidad de objects que necesitan contener estas matrices de bits, podría tener un impacto neto negativo tanto en la velocidad como en el uso de la memory.

 #define BITOP(a,b,op) \ ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a)))) 

no trabajará …

Fijar:

 #define BITOP(a,b,op) \ ((a)[(size_t)(b)/(8*sizeof *(a))] op ((size_t)1<<((size_t)(b)%(8*sizeof *(a))))) 

Encontré esta pregunta mientras escribía un marco de bit array que tiene la intención de administrar grandes cantidades de "bits" similares a Java BitSet. Estaba buscando ver si el nombre que decidí estaba en conflicto con otros frameworks de Objective-C.

De todos modos, estoy empezando esto y estoy decidiendo si publicarlo en SourceForge u otros sitios de alojamiento de código abierto.

Déjame saber si estás interesado

Editar: He creado el proyecto, llamado BitArray, en SourceForge. La fuente está en el repository SF SVN y también he cargado un marco comstackdo. Este ENLACE te llevará allí.

  • Franco
Intereting Posts