1

C ++でビットフラグをよりよく理解するために、小さなクラスを作成しようとしています。しかし、何かがうまくいきません。間違った値を出力します。問題はどこだ?フラグを追加する方法を誤解していますか? または、ビットフィールドにそれらがあるかどうかを確認しますか?

コードは次のとおりです。

#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
}

プログラムの出力:

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: 
4

4 に答える 4

3

remove_flag() メソッドにバグがあります。フラグ |= i; である必要があります。

ただし、次のように O(1) を実行します。

void remove_flag(flag f) { m_flags &= ~f; }
于 2009-02-07T16:17:45.313 に答える
3

has_flag()remove_flag()は間違っています。それらは次のようになります。

bool has_flag(flag f) { return !!(m_flags & f); }
void remove_flag(flag f) 
{
    m_flags &= ~f;
}
于 2009-02-07T16:20:05.790 に答える