Comment stocker un tableau de bits en C++?
Quelle est la meilleure façon de stocker un tableau de bits en C++ (Pas de Boost, juste des conteneurs standards), représentant, par exemple, un bitmap d'allocation de volume?
j'ai pensé std::vector<bool>
c'était une bonne idée, mais apparemment, c'est Mal et obsolètes, alors y a-t-il un meilleur choix?
Aussi:
si j'ai un tableau d'octets en mémoire, Comment vais-je les copier dans le conteneur recommandé?
(J'ai du mal à déterminer ce pour vector<bool>
.)
5 réponses
un tableau de char et ensuite masquer par 0x1 agira comme un tableau de bits.
Exemple:
char bitarray[4]; // since 4*8 this array actually contains 32 bits
char getBit(int index) {
return (bitarray[index/8] >> 7-(index & 0x7)) & 0x1;
}
void setBit(int index, int value) {
bitarray[index/8] = bitarray[index/8] | (value & 0x1) << 7-(index & 0x7);
}
bien sûr, ces opérations sont généralement relativement lent, mais si la mémoire est un problème c'est une manière décente pour aller. J'ai choisi de char pour cela de réduire le nombre de changements nécessaires. Cependant, il peut encore être plus rapide avec des entiers.
std::vector<bool>
comme son propre type spécialisé. La seule chose que vous devez faire attention est de ne pas le traiter comme un standard bool
conteneur, car il n'est pas.
pour vanilla C++, il y a std:: bitset.
Bitset est très similaire au vecteur (aussi connu sous le nom de bit_vector): il contient une collection de bits, et fournit un accès à temps constant chaque bit. Il y a deux grandes différences entre bitset et vecteur. Premièrement, la taille d'un bitset ne peut pas être changée: modèle de paramètre N, qui spécifie le nombre de bits dans le bitset, doit être une constante entière. Deuxièmement, bitset n'est pas une Séquence; dans en fait, ce N'est pas un conteneur STL du tout.
Matt Austern a un bel article sur son utilisation.
: Si votre tableau d'octets (tableau de bits?) s'insère dans un long non signé, alors vous pouvez l'assigner à un std::bitset directement:
unsigned long myByteArray = 0xABCD;
std::bitset<32> bitten( myByteArray );
je pense que certains points sur le site, vous liés ne sont pas correctes. Sur presque tous les ordinateurs la taille d'un bit est vraiment un octet (même qu'un caractère) parce que les ordinateurs peuvent seulement adresser un octet pas un bit à l'intérieur d'un octet (si vous pouviez alors vous auriez seulement un huitième de l'espace d'adressage que vous avez actuellement avec des octets)
je voudrais juste utiliser un octet pour votre vecteur parce qu'il donne à d'autres personnes qui lisent votre code une meilleure idée de l'empreinte mémoire de votre application.
la Ram est très abondante dans les ordinateurs modernes de sorte que vous pouvez être en mesure d'utiliser des types intégraux plus grands, mais de façon réaliste, vous ne pouvez pas aller plus petit qu'un octet.
Pour copier des données à partir d'un récipient à l'autre d'abord créer un itérateur pour le conteneur
vecteur:: iterator myItr = myVector.begin ()
et itérer à travers le vecteur avec une boucle while ou une boucle for jusqu'à ce que myItr atteigne myVector.fin.)(
Pour exemple
for(vector<bool>::iterator myItr = myVector.begin(); myItr<myVector.end(); ++myItr)
{
otherContainer.append(*myItr);
}
std:: bitset va faire, aussi longtemps que votre tableau de bits est de taille fixe.
Il y a aussi std::dynamic_bitset, mais je ne suis pas sûr à 100% qu'il soit dans le standard.