2010-08-31 4 views
4

J'ai besoin d'utiliser des drapeaux de plus de 32 bits (33 pour être exact maintenant). J'ai essayé et trouvé que std :: bitset ne gère pas plus de 32 bits (ulong). Dois-je utiliser un vecteur ou existe-t-il un moyen de faire fonctionner le bitet?bitset pour plus de 32 bits?

Je suis limité à C++ 98 dans ce projet, donc je ne peux pas utiliser boost.

Merci.

Edit:

Je voudrais faire quelque chose comme ceci:

const uint64 kBigNumber = 1LL << 33; 
std::bitset<33> myBitSet; 
... 
switch(myBitSet) { 
    case kBigNumber: 
    // do something 
    ... 
} 
+0

Vous devrez probablement effectuer plusieurs opérations de bits sur des valeurs 32 bits individuelles? – Gian

+0

En fait, j'aimerais pouvoir effectuer des opérations au niveau du bit entre les bitsets et les constantes 64 bits. Quelque chose comme si (my33bitset & kA64bitConst) {...}. De plus, la possibilité d'utiliser les consts de 64 bits dans la clause case de l'instruction switch sera excellente. –

+0

Comment pourriez-vous être limité à C++ 98? – Puppy

Répondre

4

Je viens de retester std::bitset avec 65 bits et sur mon Linux 32 bits il fonctionne bien et comme prévu.

Une exception notable est la méthode to_ulong() qui déclenche une exception si un bit défini est tronqué pendant la conversion. Maintenant j'y pense et c'est assez évident: il n'y a pas d'autre moyen d'empêcher l'application d'obtenir des données tronquées. Et le comportement is also documented.


Pour la Modifier avec interrupteur/cas. Pourquoi avez-vous besoin de std::bitset alors? Votre plate-forme semble déjà prendre en charge les numéros de 64 bits - utilisez-les. std::bitset est conçu pour être utilisé en tant que an light-weight bit array avec allocation de mémoire statique. Il n'est pas destiné à être utilisé en remplacement du nombre.

+0

J'utilise en clair 64 bits non signé en ce moment. J'explore différentes façons de le faire et aussi de planifier pour l'avenir où les drapeaux peuvent être plus de 64 bits. –

+0

Vous pouvez utiliser uniquement des types entiers pour le commutateur/cas en C/C++. 'uint64_t' (ou tout autre type d'entier le plus large que votre compilateur supporte) est aussi loin que vous seriez capable de sauter sur l'arche 32bit.Et plus de 64 drapeaux - cela semble être une mauvaise idée. Demandez ici SO comment éviter cela. – Dummy00001

5

Would std::vector<bool> travail pour vous? Il peut être redimensionné, est raisonnablement rapide et a un faible encombrement. Cela fait aussi partie du STL.

+0

Pourtant, pas compatible STL, passionnément –

6

std::bitset devrait fonctionner avec plus ou tailles moins arbitraires - il est pas normalement limitée à la taille d'un unsigned long (bien qu'il puisse regarder de cette façon, parce qu'il ya un constructeur qui construit un bitset basé sur les bits dans un non signé longtemps).

Si cela ne fonctionne pas, vector<bool> peut vous être utile, mais vous devez être conscient qu'il est à peu près un vector que le nom - il est pas vraiment un récipient (c.-à-ne sont pas conformes à les exigences normales du conteneur).

1

Vous pouvez utiliser le to_string sur votre bitset et secrètes en arrière en utilisant strtoull

const uint64 kBigNumber = 1LL << 33; 
std::bitset<33> myBitSet; 
... 
unsigned long long bitSetLong = strtoull(myBitSet.to_string<char,char_traits<char>,allocator<char> >().c_str(), NULL, 2); 
switch(bitSetLong) { 
    case kBigNumber: 
    // do something 
    ... 
} 

note ci-dessus ne peut fonctionner que jusqu'à 64 bits.

Questions connexes