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

Posted

技术标签:

【中文标题】位掩码:通过 set 方法设置对象的不同状态【英文标题】:Bit Masks: Set different states of an object via set method 【发布时间】:2014-01-27 11:06:44 【问题描述】:

我有一种材料,可以是热的或冷的、白色或黑色的。状态可以是热和白、热和黑、冷和白、冷和黑。我有以下课程

   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

【问题讨论】:

你到底想完成什么?状态类型列表似乎没有意义:你不能有 just HOT - 颜色位必须有 some 值,无论是 0 还是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

【讨论】:

如果我有另一个我不知道的状态(用 DEFAULT 表示,使用了错误的词:(),我该如何设置?我应该为 DEFAULT 分配一个负数而不是零吗?跨度> @ontherocks 你可以让它使用负数。您还可以添加一点来说明状态是否已知。 如果我使用DEFAULT = 1 &lt;&lt; 0, HOT = 1 &lt;&lt; 1, WHITE = 1 &lt;&lt; 2,现在如何设置COLD和BLACK?它仍然是零? @ontherocks 使用 0 作为“未知”状态可能更方便,所以我的编辑基于此 @ontherocks 表示材质和颜色不是默认的位【参考方案2】:

没有。

使用~ 表示否定所有位;我想这不是你想要的,因为它会在你的表示中产生很多很多的 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

【讨论】:

以上是关于位掩码:通过 set 方法设置对象的不同状态的主要内容,如果未能解决你的问题,请参考以下文章

C中的位掩码

在Where子句中使用位掩码

什么是位掩码?

位掩码:如何确定是不是只设置了一位

位掩码的整数和位(n)数据类型之间有啥区别吗?

你问的Svelte来了--静态编译直出DOM独立分发Web Components位掩码变化追踪