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>.)

11
demandé sur Mehrdad 2011-10-20 04:35:18

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.

2
répondu Serdalis 2015-06-23 12:21:17
parfait utiliser 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.

2
répondu Mehrdad 2017-05-16 10:23:07

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 );
1
répondu Gnawme 2011-10-21 22:12:47

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);
}
0
répondu bashirs 2011-10-20 00:41:45

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.

0
répondu Eugen Constantin Dinca 2011-10-20 00:53:10