# 【位运算与标签】

使用左运算符 << 通常可以定义标签。

使用 | 运算符可以组合标签。

使用 |= 运算符可以增加标签。

使用 & 运算符可以判断是否包含标签。

# 测试例子

export class TagTest {
    static readonly APPLE = 1 << 0; //苹果
    static readonly BANANA = 1 << 1; //香蕉
    static readonly CAR = 1 << 2; //汽车
    static readonly BUS = 1 << 3; //巴士
    static readonly FRUIT = TagTest.APPLE | TagTest.BANANA;
    static readonly VEHICLES = TagTest.CAR | TagTest.BUS;

    public static testFunc() {
        // 包含苹果和汽车的集合
        let setA = 0;
        setA |= TagTest.APPLE;
        setA |= TagTest.CAR;

        const findTagA = 0;
        if (setA & findTagA) {
            console.log("setA 包含 0");
        } else {
            console.log("setA 不包含 0"); // 会输出
        }

        const findTagB = TagTest.CAR;
        if (setA & findTagB) {
            console.log("setA 包含 CAR"); // 会输出
        } else {
            console.log("setA 不包含 CAR");
        }

        const findTagC = TagTest.CAR | TagTest.APPLE;
        if (setA & findTagC) {
            console.log("setA 包含 CAR 和 APPLE"); // 会输出
        } else {
            console.log("setA 不包含 CAR 和 APPLE");
        }

        const findTagD = TagTest.CAR | TagTest.BANANA;
        if (setA & findTagD) {
            console.log("setA 包含 CAR 或者 BANANA"); // 会输出
        } else {
            console.log("setA 不包含 CAR 或者 BANANA");
        }

        const findTagE = TagTest.BUS | TagTest.BANANA;
        if (setA & findTagE) {
            console.log("setA 包含 BUS 或者 BANANA");
        } else {
            console.log("setA 不包含 BUS 或者 BANANA"); // 会输出
        }

        if (setA & TagTest.VEHICLES) {
            console.log("setA 中包含 交通工具"); // 会输出
        }
        if (setA & TagTest.FRUIT) {
            console.log("setA 中包含 水果"); // 会输出
        }
    }
}