我的材料可以是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
答案 0 :(得分:1)
没有
使用~
意味着否定所有位;我想这不是你想要的,因为它会在你的表示中产生大量的1(除了一个比特之外)。
每种状态都有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
答案 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