React源码中的位运算技巧
作者:卡颂
简介:《React技术揭秘》作者
来源:SegmentFault 思否社区
大家好,我卡颂。
这两年有不少朋友和我吐槽 React 源码,比如:
调度器为什么用小顶堆这种数据结构,直接用数组不行?
源码里各种单向链表、环状链表,直接用数组不行?
源码里各种位运算,有必要么?
几个常用位运算
按位与(&)
// 3对应的 Int32
0b000 0000 0000 0000 0000 0000 0000 0011
// 2对应的 Int32
0b000 0000 0000 0000 0000 0000 0000 0010
0000 0011
& 0000 0010
-----------
0000 0010
按位或(|)
0000 1010
| 0000 0011
-----------
0000 1011
按位非(~)
// 3对应的 Int32
0b000 0000 0000 0000 0000 0000 0000 0011
// 逐位取反
0b111 1111 1111 1111 1111 1111 1111 1100
标记状态
// A上下文
const A = 1;
// B上下文
const B = 2;
// 没有处在上下文
const NoContext = 0;
// 当前所处上下文
let curContext = 0;
// 进入A上下文
curContext |= A;
0000 0000 // curContext
| 0000 0001 // A
-----------
0000 0001
// 是否处在A上下文中 true
(curContext & A) !== NoContext
// 是否处在B上下文中 false
(curContext & B) !== NoContext
// 从当前上下文中移除上下文A
curContext &= ~A;
// 是否处在A上下文中 false
(curContext & A) !== NoContext
0000 0001 // curContext
& 1111 1110 // ~A
-----------
0000 0000
优先级计算
0b000 0000 0000 0000 0000 0000 0001 0001
function getHighestPriorityLane(lanes) {
return lanes & -lanes;
}
lanes取反(~lanes)
加1
lanes 0001 0001
~lanes 1110 1110 // 第一步
+1 1110 1111 // 第二步
0001 0001 // lanes
& 1110 1111 // -lanes
-----------
0000 0001
总结
评论