使用一个变量表示多种状态

枚举与多状态

前言

我们通常会使用一个枚举表示状态,如

1
2
3
4
5
enum State{
A,
B,
C,
}

我们可以声明一个枚举变量表示一个状态
但是: 如果我要表示多个状态怎么办。这种方式只能解决一个状态的问题。

二进制的位运算

枚举的多个状态可以通过二进制的位运算来实现。
原理是什么

1
int state=0;//表示一个状态
  1. 使用 | 将每一个状态添加到state里面。如1的二进制是0001,2的二进制为0010。包含两个状态的值为0011。
  2. 使用 & 来判断state是否包含此状态,如1000&0101=1000,因为我们是通过每一位是否包含1来判断是否包含这个状态。所以每一个状态必须满足2^n。
    我们将枚举的每一个值写作2^n,这样每一个值在二进制下只有一位为1,其余为0。

    实现

    枚举声明如下:

    1
    2
    3
    4
    5
    enum 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
    3
    private boolean includeState(State state) {
    return (this.state & state) == state;
    }

    删除状态

    删除状态需要先判断一下是否存在此状态。然后通过添加状态的取反就可以将状态删除。
    1
    2
    3
    private removeState(State state) {
    this.state = (~state)&this.state;
    }