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

Bit Masks: Set different states of an object via set method

本文关键字:对象 状态 设置 方法 掩码 集合      更新时间:2023-10-16

我有一种材料,可以是热,白色或黑色的材料。各州可以是热,白色,黑色,寒冷,白色,寒冷和黑色。我有以下课程

   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

编辑后,这个问题似乎有所不同,并且不需要 @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

no。

使用~表示否定所有位;我想这不是您想要的,因为它在您的表示形式中会导致很多1s(除了一位以外)。您的每个状态都有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