位运算符的应用

179 阅读1分钟

出题

一个对象上有多种 flag
比如: 他可以是硬的(hard) 也可以是红色的(red) 也可以是长的(long)
问 如何用程序表示
以及如何对 flag做‘增删查’
代码: 对象(硬的、长的)
增加: 对象(硬的、红色、长的)
删除:对象(硬的、红色)
查: 对象(硬的、红色) -> 对象是不是硬的 -> 是的
  • 提示一下; 除了用数组的方式实现; 还可以思考一下用位运算的方式实现;
const enum Flags {
  HARD = 1,
  LONG = 1 << 1,
  RED = 1 << 2,
}

class FlagObj {
  private _flags = 0b0;
  constructor() {}
  hasFlag(flag: Flags) {
    return !!(this._flags & flag);
  }
  addFlag(flag: Flags) {
    return (this._flags = this._flags | flag);
  }
  delFlag(flag: Flags) {
    if (this.hasFlag(flag)) {
      return (this._flags = this._flags ^ flag);
    }
  }
}

const flag = new FlagObj();
console.log("---new FlagObj---");
console.log("HARD-->", flag.hasFlag(Flags.HARD));
console.log("LONG-->", flag.hasFlag(Flags.LONG));
console.log("RED-->", flag.hasFlag(Flags.RED));
flag.addFlag(Flags.HARD);
console.log("---addFlag(Flags.HARD)---");
console.log("HARD-->", flag.hasFlag(Flags.HARD));
console.log("LONG-->", flag.hasFlag(Flags.LONG));
console.log("RED-->", flag.hasFlag(Flags.RED));
flag.addFlag(Flags.LONG);
console.log("---addFlag(Flags.LONG)---");
console.log("HARD-->", flag.hasFlag(Flags.HARD));
console.log("LONG-->", flag.hasFlag(Flags.LONG));
console.log("RED-->", flag.hasFlag(Flags.RED));
flag.addFlag(Flags.HARD);
console.log("---addFlag(Flags.HARD)---");
console.log("HARD-->", flag.hasFlag(Flags.HARD));
console.log("LONG-->", flag.hasFlag(Flags.LONG));
console.log("RED-->", flag.hasFlag(Flags.RED));
flag.delFlag(Flags.LONG);
console.log("---delFlag(Flags.LONG)---");
console.log("HARD-->", flag.hasFlag(Flags.HARD));
console.log("LONG-->", flag.hasFlag(Flags.LONG));
console.log("RED-->", flag.hasFlag(Flags.RED));

备注:二进制前缀为0b,因此new FlagObj() 产生的对象里记录状态地私有属性初始状态为 0b0 也就是000,枚举类型中每一个对应一个二进制数,例如: 硬的001、长的010、红的100

QQ截图20211223115113.png