Dal momento che si parla di C così come C++, darò per scontato che un C++ - orientato soluzione come boost::dynamic_bitset
potrebbe non essere applicabile, e parlare di un'implementazione a basso livello C anziché. Nota che se qualcosa come boost::dynamic_bitset
funziona per te, o c'è una libreria C pre-esistente che puoi trovare, allora usarli può essere meglio che lanciare il tuo.
Avviso: nessuno dei seguenti codici è stato testato o anche compilato, ma dovrebbe essere molto vicino a quello che ti serve.
Per iniziare, suppone che si abbia una dimensione N. bitset fissa Poi qualcosa come le seguenti opere:
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 */ }
Come scritto, questo è un po 'cruda in quanto implementa una sola bitset globale con una dimensione fissa . Per affrontare questi problemi, si vuole iniziare con un qualcosa di dati struture come il seguente:
struct bitset { word_t *words; int nwords; };
e poi scrivere funzioni per creare e distruggere queste bitset.
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);
}
Ora, è relativamente semplice per modificare le funzioni precedenti per prendere un parametro struct bitset *
. Non c'è ancora modo di ridimensionare un bitset durante la sua vita, né ci sono limiti di controllo, ma non sarebbe difficile aggiungere a questo punto.
fonte
2010-04-13 22:13:28
Io non sono molto sicuro di cosa si intende quando si dice che una "normale int/char maschera di bit" non è molto pulito, quando la lunghezza della matrice è maggiore della lunghezza del tipo di dati? Ho pubblicato una tradizionale implementazione di bitet C di seguito, dal momento che interpreto la tua richiesta di una soluzione C/C++ e la tua affermazione che 'std :: vector' non è disponibile per indicare che potresti aver bisogno di una soluzione C diritta. –