Comment utilisez-vous les drapeaux bitwise en C ++?
Comme par cette site, je souhaite représenter un Labyrinthe avec un 2 dimensions tableau de 16 bits entiers.
Chaque 16 bits entier doit contenir les informations suivantes:
Voici une façon de le faire (ce n'est pas la seule): un 12x16 labyrinthe de la grille peut être représenté comme une matrice m[16][12] des entiers de 16 bits. Chaque élément du tableau qui aurait contient toutes les informations d'une seule cellule correspondante dans la grille, avec le nombre entier de bits mappé comme ceci:
le texte d'alt http://www.mazeworks.com/mazegen/mazetut/tut5.gif
Pour abattre un mur, de définir une frontière, ou de créer un chemin particulier, tout ce que nous devons faire est de flip bits dans un ou deux éléments du tableau.
Comment puis-je utiliser bit à bit des drapeaux sur 16 bits entiers afin que je puisse régler chacun de ces bits et vérifier si elles sont ensemble.
J'aimerais le faire sous une forme facilement lisible (c'est à dire, la Frontière.W, Frontière.E, Les Murs.N, etc).
Comment est-ce fait en C++? Puis-je utiliser hexadécimal pour représenter chacun (c'est à dire, les Murs.N = 0x02, les Murs.E = 0x04, etc)? Dois-je utiliser un enum?
Voir aussi Comment définissez-vous, claire, et de basculer d'un seul bit?.
source d'informationauteur KingNestor
Vous devez vous connecter pour publier un commentaire.
Utilisation
std::bitset
Si vous souhaitez utiliser bitfields puis c'est une façon très simple:
Puis votre code peut tester la qualité de chacun de vrai ou faux.
Utiliser hex constantes/les énumérations et les opérations bit à bit si vous vous souciez de ce qui notamment bits veux dire quoi.
Sinon, utiliser C++ bitfields (mais il faut être conscient que l'ordre des bits de l'entier sera compilateur-dépendant).
Apprendre votre bit-à-bit opertors: &, |, ^, et !.
Au-dessus de beaucoup de C/C++, les fichiers, j'ai vu des indicateurs définis dans l'hex de masque de chaque bit.
Pour voir si un bit est activé, vous ET avec 1. Pour l'activer, vous OU avec 1. Pour basculer comme un interrupteur, XOR avec 1.
De manipuler des ensembles de bits, vous pouvez également utiliser ....
std::bitset<N>
Vous pouvez le faire avec hexadécimal des drapeaux ou des énumérations comme vous l'avez suggéré, mais le plus lisible/auto-documentation est probablement d'utiliser ce que l'on appelle "bitfields" (pour plus de détails, Google pour
C++ bitfields
).Oui, une bonne façon est d'utiliser hex décimal pour représenter les modèles de bits. Ensuite, vous utilisez les opérateurs au niveau du bit pour manipuler votre 16 bits ints.
Par exemple:
Je ne suis pas un grand fan de bitset. C'est juste plus de frappe à mon avis. Et de ne pas cacher ce que vous faites de toute façon. Vous avez encore des & && | bits. À moins que vous ramassez sur 1 bit. Que peut travailler pour de petits groupes de drapeaux. Non pas que nous avons besoin de cacher ce que nous faisons. Mais l'intention d'une classe est habituellement à faire quelque chose de plus facile pour les utilisateurs. Je ne pense pas que cette classe accomplit.
Dire, par exemple, vous avez un système de drapeau avec .. 64 drapeaux. Si vous voulez tester.. je ne sais pas.. 39 dans 1 instruction if pour voir si ils sont tous sur... à l'aide de bitfields est une énorme douleur. Vous devez taper tout.. Cours. Je fais l'hypothèse que vous utilisez seulement bitfields de la fonctionnalité et de ne pas mélanger et assortir les méthodes. Même chose avec bitset. À moins que quelque chose m'échappe avec la classe.. ce qui est tout à fait possible, car j'ai rarement l'utiliser.. je ne vois pas un moyen de tester toutes les 39 drapeaux, sauf si vous tapez le trou de la chose ou d'avoir recours à des "méthodes standard" (à l'aide d'enum drapeau de listes ou de certains régimes de valeur pour 39 bits et à l'aide de la bitsets && operator). Ceci peut être gênant en fonction de votre approche. Et je sais.. 64 drapeaux semble beaucoup. Et bien. Il est.. en fonction de ce que vous faites. Personnellement parlant, la plupart des projets sur lesquels je suis impliqué dépendent du pavillon des systèmes. Donc en fait.. 64 n'est pas du jamais vu. Si 16~32 est beaucoup plus fréquent que dans mon expérience. Je suis en fait à aider dans un projet où un système de drapeau a 640 bits. Il s'agit essentiellement d'un système de privilège. Donc c'est un peu logique pour organiser tous ensemble... Cependant.. certes.. je voudrais briser un peu.. mais.. euh... je suis en aidant.. pas la création.