位掩码:通过set方法设置对象的不同状态

时间:2014-01-27 11:06:45

标签: c++ class set bit-manipulation member

我的材料可以是HOT或COLD,WHITE或BLACK。各州可以是HOT和WHITE,HOT和BLACK,COLD和WHITE,COLD和BLACK。我有以下课程

   class myMaterial
    {
    public:
        enum state
        {
            DEFAULT     = 0,
            HOT         = 1 << 0,
            WHITE       = 1 << 1
        };

        void SetState(int);

    private:
        int m_state;
    };


    void myMaterial::SetState(int state)
    {
        m_state = state;
    }

现在在main()中,我调用SetState方法来设置这些状态

myMaterial material;
material.SetState(myMaterial::HOT);

以下按位操作是否正确,以设置所有类型的状态

HOT and WHITE  =>  myMaterial::HOT | myMaterial::WHITE
HOT and BLACK  =>  myMaterial::HOT | ~myMaterial::WHITE
COLD and WHITE =>  ~myMaterial::HOT | myMaterial::WHITE
COLD and BLACK =>  ~myMaterial::HOT | ~myMaterial::WHITE

2 个答案:

答案 0 :(得分:1)

没有

使用~意味着否定所有位;我想这不是你想要的,因为它会在你的表示中产生大量的1(除了一个比特之外)。 每种状态都有3种状态,例如冷,热,不知道。所以你需要2位,而不是1位。

修改

现在问题已经改变了,但如果我们假设每个位仍然有3个状态,则需要两位。因此,假设您有COLDHOT州。然后:

HOT = 1 << 0;
COLD = 1 << 1;

然后,如果您想将变量var设置为COLD,请确保它不是HOT,您需要执行以下操作:

var = (var | COLD) // add coldness
var = var & ~HOT // remove hotness

或等效地:

var = (var | COLD) & ~HOT

答案 1 :(得分:1)

编辑之后,问题似乎有点不同,并且不再需要@adrin的每个属性2位的解决方案。

现在只是:

HOT and WHITE = myMaterial::HOT | myMaterial::WHITE
HOT and BLACK = myMaterial::HOT
COLD and WHITE = myMaterial::WHITE
COLD and BLACK = 0

如果你添加一个额外的位来说明状态是否已知:

UNKNOWN = 0
HOT and WHITE = myMaterial::HOT | myMaterial::WHITE | myMaterial::KNOWN
HOT and BLACK = myMaterial::HOT | myMaterial::KNOWN
COLD and WHITE = myMaterial::WHITE | myMaterial::KNOWN
COLD and BLACK =  myMaterial::KNOWN