位运算的应用场景

基于Boolean状态多属性场景(对象在某几个并列的属性上,具有Boolean值状态),可以考虑使用位运算。

比如开关类的场景。

角色的案例

比如一个用户可能有多个角色,我们想判断他是不是某个角色的时候,就能用位运算来处理。

假设我们做了如下这个设定:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// 角色类型
const ROLE_GUEST = 0;
const ROLE_DEVELOPER = 2;
const ROLE_DESIGNER = 4;
const ROLE_PRODUCTER = 8;

class People{
constructor() {
this.role = ROLE_GUEST;
this.printBitCode();
}

addRole(role) {
this.role |= role;
this.printBitCode();
}
deleteRole(role) {
this.role &= ~role;
this.printBitCode();
}
isRole(role) {
return this.role & role;
}

printBitCode() {
console.log(this.role.toString(2));
}
}

function isDeveloper(people) {
if (people.isRole(ROLE_DEVELOPER)) {
console.log("张三是个开发人员");
} else {
console.log("张三不是开发人员");
}
}

const people = new People();
isDeveloper(people);

console.log("给张三添加开发人员的角色");
people.addRole(ROLE_DEVELOPER);
isDeveloper(people);

console.log("删除张三开发人员的角色");
people.deleteRole(ROLE_DEVELOPER);
isDeveloper(people);

可以看到输入结果如下:

1
2
3
4
5
6
7
8
0
张三不是开发人员
给张三添加开发人员的角色
10
张三是个开发人员
删除张三开发人员的角色
0
张三不是开发人员

但是这有个弊端,就是如果数据是存储在数据库中的,你想根据角色查询用户的话,需要采用位运算,比如查询开发人员列表,就需要这样写:

1
select name, role from user where role & 2;

我不确定这样多了运算,对于性能的影响有多大,待测试。

资料

位运算介绍:

https://www.cnblogs.com/tinys-top/p/11648535.html