位掩码(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 )
A8w
B4 5 6 7x
C2 3 6 7y
D1 3 5 7z
瓶号有毒哪几只老鼠死(0死 1生)
81w=0, x,y,z=1
71w=1, x,y,z=0
61w=1, x,y=0, z=1
51w=1, x,z=0, y=1
41w=1, x=0, y,z=1
31w=1, x=1, y,z=0
21w=1, x,z=1, y=0
11w=1, x,y=1, z=0