位掩码:通过集合方法设置对象的不同状态
Bit Masks: Set different states of an object via set method
我有一种材料,可以是热,白色或黑色的材料。各州可以是热,白色,黑色,寒冷,白色,寒冷和黑色。我有以下课程
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个状态,则需要两个位。因此,假设您有COLD
和HOT
状态。然后:
HOT = 1 << 0;
COLD = 1 << 1;
,然后如果要将变量var
设置为COLD
,请确保它不是HOT
,则需要执行:
var = (var | COLD) // add coldness
var = var & ~HOT // remove hotness
或等效:
var = (var | COLD) & ~HOT
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 在容器上移动分配:以前包含的对象的状态
- MATLAB:跟踪imufilter对象中的状态变化
- 是否很好地使用状态模式来维护当前选定的对象?
- "Extern"对象问题:错误:Id 返回 1 个退出状态
- 访问处于"移自"状态的对象
- 是 *this = Ctor();清除对象状态的合法和高效?
- 设计模式中对象中的过程(方法和操作)的状态
- 如何保持异步函数中使用成员的shared_ptr对象的活动状态?
- 无法访问/存储地图中的游戏状态对象
- 单元测试 - 设置私人成员以获得所需的对象状态
- 在不同的运行中保持对象状态
- 调用 ~Derived() 和 ~Base() 之间的对象状态
- 异常安全 - 用于可靠回滚对象状态的模式
- 从函数中更改对象状态
- 正在更改const方法中的对象状态
- c++中对象状态的重构
- C++RAII来管理对象状态的更改和恢复
- 从默认构造函数调用重载构造函数时,维护对象状态信息
- c++11中的线程安全对象状态操作