J'essaie d'écrire une petite classe pour mieux comprendre les drapeaux de bits en C++. Mais quelque chose ne marche pas. Il imprime les mauvaises valeurs. Où est le problème? Ai-je mal compris comment ajouter des drapeaux? Ou vérifier si le champ de bits les a?Enum bitfield container class
Heres le code:
#include <iostream>
enum flag
{
A = 1, B = 2, C = 4
};
class Holder
{
public:
Holder() : m_flags(A) {}
~Holder() {}
void add_flag(flag f) { m_flags |= f; }
bool has_flag(flag f) { return ((m_flags&f)==f); }
void remove_flag(flag f)
{
unsigned int flags = 0;
for (int i = 1; i<=(int)C; i *= 2)
{
if ((flag)i!=f && has_flag(f))
flags |= f;
}
m_flags = flags;
}
void print()
{
std::cout << "flags are now: " << m_flags << " | holding: ";
for (int i = 1; i<=(int)C; i *= 2)
{
if (has_flag((flag)i))
std::cout << i << " ";
}
std::cout << std::endl;
}
private:
unsigned int m_flags;
};
int main()
{
Holder h;
h.print(); // should print 1
h.add_flag(B);
h.print(); // should print 1 2
h.remove_flag(A);
h.print(); // should print 2
h.add_flag(C);
h.print(); // should print 2 4
h.remove_flag(B);
h.print(); // should print 4
}
sortie du programme:
flags are now: 1 | holding: 1
flags are now: 3 | holding: 1 2
flags are now: 1 | holding: 1
flags are now: 5 | holding: 1 4
flags are now: 0 | holding:
Effacement d'un drapeau est probablement plus rapide (et plus simple) si cela est fait sans vérification préalable. –
vous avez raison. J'ai supposé que c'était une expérience d'apprentissage pour le PO et j'ai simplement corrigé son code pour travailler. Je n'ai pas corrigé son code pour le rendre plus rapide. –
Que se passe-t-il si f a plus de 1 bit défini, mais que tous ne sont pas définis dans flag? flag & = ~ f résout cela. –