位掩码(BitMask)是 “位” (Bit) 和 “掩码” (Mask) 的组合词。“位”指代着二进制数据当中的二进制位,而“掩码”指的是一串用于目标数据进行按位操作的二进制数字。组合起来就是“用一串二进制数字(掩码)去操作另一串二进制数字”的意思。
掩码就是一串二进制代码对目标字段进行位与运算,屏蔽当前的输入位,最终得到一个合理的需求。
场景应用 #
权限 #
假设系统中有4中权限: 增删改查,使用位运算来表示权限,定义四个变量如下
Insert = 1 // 0001
Delete = 2 // 0010
Update = 4 // 0100
Select = 8 // 1000
假设初始权限为 0000 如果想给用户增加权限,则使用 | 或运算
给用户增加 Insert 权限
0000 | 0001 = 0001给用户同时增加 Insert 和 Delete 权限
0000 | 0001 | 0010 = 0011- 此时获取到的
0011十进制为3则怎么知道用户拥有哪些权限呢? 只需要采用&运算 - 是否有 Insert 权限
b0011 & b0001 = b0001 = 1有权限 - 是否有 Delete 权限
b0011 & b0010 = b0010 = 2有权限 - 是否有 Update 权限
b0011 & b0100 = b0000 = 0无权限 - 是否有 Select 权限
b0011 & b1000 = b0000 = 0无权限
- 此时获取到的
删除权限 如用户有 Insert 和 Delete 权限,现在需要删除 Insert 权限
// 有 Delete 和 Insert 权限
0011 & ~ 0001 (这里为要删除的权限)
↓ 取反 补码 十进制
1. 先做 ~ 0001, 这里我们只到补码部分 ~ 0 0001 => 1 1110 => 1 0010 => -2
2. 转换 0011 到补码形式 -> 0 0011
3. 0011 & 0010 => 0010 => 2 user.premission = user.premission & ~ Insert === Delete
老鼠试毒 #
有 1000 瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡,问至少要多少只小白鼠才能在24小时内鉴别出哪瓶水有毒?
假设只有 8 瓶水,需要 3 个老鼠
瓶号 A B C D
w x y z
1号瓶 0 0 0 1
2号瓶 0 0 1 0
3号瓶 0 0 1 1
4号瓶 0 1 0 0
5号瓶 0 1 0 1
6号瓶 0 1 1 0
7号瓶 0 1 1 1
8号瓶 1 0 0 0
# 现在将8瓶溶液按照如下进行组合成4瓶溶液分别位 A B C D 四只老鼠分别玩儿 w,x,y,z
| 混合后的溶液 | 几号瓶混合的 | 给哪个老鼠喝 | 结果 (0 / 1 ) |
|---|---|---|---|
| A | 8 | w | |
| B | 4 5 6 7 | x | |
| C | 2 3 6 7 | y | |
| D | 1 3 5 7 | z |
| 瓶号 | 有毒 | 哪几只老鼠死(0死 1生) |
|---|---|---|
| 8 | 1 | w=0, x,y,z=1 |
| 7 | 1 | w=1, x,y,z=0 |
| 6 | 1 | w=1, x,y=0, z=1 |
| 5 | 1 | w=1, x,z=0, y=1 |
| 4 | 1 | w=1, x=0, y,z=1 |
| 3 | 1 | w=1, x=1, y,z=0 |
| 2 | 1 | w=1, x,z=1, y=0 |
| 1 | 1 | w=1, x,y=1, z=0 |