# 10.位运算(&、|、^、~、>>、<<)在实际开发中的应用
# & 和 |
# 前置知识
- &:与运算符 运算规则:两位同时为1,结果才为1,否则结果为0。
0&0=0 0&1=0 1&0=0 1&1=1
1
- |:或运算符 运算规则:参加运算的两个对象只要有一个为1,其值为1。
0^0=0 0^1=1 1^0=1 1^1=0
1
# 应用
- 状态管理 如 React Reconciler 中使用二进制来表示虚拟 Dom 状态 类似:
export const Placement = /* */ 0b0000000000010;
export const Update = /* */ 0b0000000000100;
export const PlacementAndUpdate = /* */ 0b0000000000110;
export const Deletion = /* */ 0b0000000001000;
1
2
3
4
2
3
4
如何理解?
假设我们有一个简单的组件,它有三种状态:可见性(Visible)、激活状态(Active)、和禁用状态(Disabled)。 可见性:1(0b001) 激活状态:10(0b010) 禁用状态:100(0b100)
我们想表示这个组件既是可见的又是激活的,该怎么判断?
首先,用或运算符
运算到 status 上
- 设置可见性:status |= 0b001 (将1按位或运算到 status 上)
- 设置激活状态:status |= 0b010 (将10按位或运算到 status 上)
此时:,status 为
0b011
。
实际使用位运算来检查组件的状态:
通过与运算,判断结果是否为 0,即0b000。
检查是否可见:status & 0b001,如果结果不为0,则表示组件是可见的。(结果为0b001
,可见状态)
检查是否激活:status & 0b010,如果结果不为0,则表示组件是激活的。(结果为0b010
,激活状态)
检查是否禁用:status & 0b100,如果结果不为0,则表示组件是禁用的。(结果为0b000
,目前是非禁用的)
总结:
- 假设有三个状态,那么需要有三个位数的二进制符来表示状态,如(0b000);
- 通过目前状态(如
0b011
表示即在可见又是激活),与期望状态(如0b001
),进行与运算。如果结果不为 0,则表示是可见状态。
将上面的状态封装为 js 代码
const Visible = 0b001;
const Active = 0b010;
const Forbidden = 0b100;
function isVisible(status){
return status & Visible !== 0
}
// .....
1
2
3
4
5
6
7
2
3
4
5
6
7
# ^:异或运算符
运算规则:参加运算的两个对象,如果两个相应位相同为0,相异为1。
← 9.cpu和内存