枚举与多状态
前言
我们通常会使用一个枚举表示状态,如
1 | enum State{ |
我们可以声明一个枚举变量表示一个状态
但是: 如果我要表示多个状态怎么办。这种方式只能解决一个状态的问题。
二进制的位运算
枚举的多个状态可以通过二进制的位运算来实现。
原理是什么
1 | int state=0;//表示一个状态 |
- 使用 | 将每一个状态添加到
state
里面。如1的二进制是0001,2的二进制为0010。包含两个状态的值为0011。 - 使用 & 来判断
state
是否包含此状态,如1000&0101=1000,因为我们是通过每一位是否包含1来判断是否包含这个状态。所以每一个状态必须满足2^n。
我们将枚举的每一个值写作2^n,这样每一个值在二进制下只有一位为1,其余为0。实现
枚举声明如下:
1
2
3
4
5enum State{
A=0,
B=1<<0,
C=1<<1,
}1
private State state =0;//状态
添加状态
1
2
3
4
private addState(State state) {
this.state = this.state | state;
}判断是否包含状态
1
2
3private boolean includeState(State state) {
return (this.state & state) == state;
}删除状态
删除状态需要先判断一下是否存在此状态。然后通过添加状态的取反就可以将状态删除。1
2
3private removeState(State state) {
this.state = (~state)&this.state;
}