Ya que mencionas C, así como C++, voy a suponer que un C++ - orientado a la solución como boost::dynamic_bitset
podría no ser aplicable, y hablan de una implementación de bajo nivel C en lugar. Tenga en cuenta que si algo como boost::dynamic_bitset
funciona para usted, o que hay una biblioteca de C preexistente que puede encontrar, entonces usarlas puede ser mejor que rodar la suya.
Advertencia: Ninguno de los siguientes códigos ha sido probado o compilado, pero debe estar muy cerca de lo que usted necesita.
Para empezar, supongamos que tiene un tamaño N. bitset fijo Entonces algo así como las siguientes obras:
typedef uint32_t word_t;
enum { WORD_SIZE = sizeof(word_t) * 8 };
word_t data[N/32 + 1];
inline int bindex(int b) { return b/WORD_SIZE; }
inline int boffset(int b) { return b % WORD_SIZE; }
void set_bit(int b) {
data[bindex(b)] |= 1 << (boffset(b));
}
void clear_bit(int b) {
data[bindex(b)] &= ~(1 << (boffset(b)));
}
int get_bit(int b) {
return data[bindex(b)] & (1 << (boffset(b));
}
void clear_all() { /* set all elements of data to zero */ }
void set_all() { /* set all elements of data to one */ }
Como está escrito, esto es un poco crudo, ya que implementa un solo bitset global con un tamaño fijo . Para hacer frente a estos problemas, que desea iniciar con una estrutura de datos algo como lo siguiente:
struct bitset { word_t *words; int nwords; };
y luego escribir funciones para crear y destruir estos bitsets.
struct bitset *bitset_alloc(int nbits) {
struct bitset *bitset = malloc(sizeof(*bitset));
bitset->nwords = (n/WORD_SIZE + 1);
bitset->words = malloc(sizeof(*bitset->words) * bitset->nwords);
bitset_clear(bitset);
return bitset;
}
void bitset_free(struct bitset *bitset) {
free(bitset->words);
free(bitset);
}
Ahora, es relativamente sencillo de modificar las funciones anteriores para tomar un parámetro struct bitset *
. Todavía no hay forma de cambiar el tamaño de un conjunto de bits durante su ciclo de vida, ni hay ninguna comprobación de límites, pero ninguno sería difícil de agregar en este punto.
No estoy muy seguro de lo que quiere decir cuando se dice que un "regular máscara de bits int/char" no es muy limpio cuando la longitud de la matriz es mayor que la longitud de tipo de datos? A continuación, he publicado una implementación de conjunto de bits C tradicional, ya que interpreto su solicitud de una solución C/C++ y su afirmación de que 'std :: vector' no está disponible para indicar que podría necesitar una solución C directa. –