Lane (通道设计)
- 不同类型的任务占有不同的通道位置, 一个通道可以存储多个任务
- 通道为总长31位的二进制码, 可用31位
位运算
- &= 删除  二进制按位与=> 均为1则为1, 否则为0
- |= 添加  二进制按位或=> 有一个为1,则为1
- ~按位翻转 1=>0, 0=>1- ~0 = -1 -1的值- 1111 1111 1111 1110
- <<按位左移,左端超出被清除, 右端补0
- 0b1100b 代表二进制
二进制数值存储
- 符号位:表示数值的正负,1=> 正, 0=>负
- 补码:二进制形式的补数,支持计算机减法运算而诞生,计算机数值统一使用补码存储;
- 正数:补码=原码
- 负数:补码=[负数绝对值]原码(符号位不变)=> 取反 => +1
 
空通道
- 0b0000000000000000000000000000000
添加任务
- 使用 lanes << 1与原通道进行运算,添加新任务
- 通道类型判断 lanes & ~LANETYPE再与通道类型比对// LANETYPE :lanes设置的初始通道类型
// lanes : 传入的通道值
// 示例
 const unblockedLanes = pendingLanes & ~suspendedLanes; // 取与
 //比较
  if (unblockedLanes !== NoLanes) { 
    nextLanes = getHighestPriorityLanes(unblockedLanes);
    nextLanePriority = return_highestLanePriority;
  } 
 获取任务
- 相应的获取任务的index,lanes >> index获取到当前任务
- 获取最高优先级的通道
// 原码
function getHighestPriorityLane(lanes: Lanes) {
return lanes & -lanes;
}
/* 解析 */
let lanes = /*  */0b0000000000000000000000000001110 //任务集合的当前通道
// 获取通道中的最右侧为1的任务, 任务的添加是通过左移,所以最右侧为最高优先级
-lanes =/*      */0b1111111111111111111111111110010 
lanes & -lanes =  0b0000000000000000000000000000010 //取与获得最右侧任务通道值
 
删除任务
//原码
  export function removeLanes(set: Lanes, subset: Lanes | Lane): Lanes {
    return set & ~subset;
  }
  /* 解析 */
  let set = /*   */0b0000000000000000000000000001110 //任务集合的当前通道
  //  subset =/* */0b0000000000000000000000000000100 // 要删除的任务通道值
  ~subset =/*    */0b1111111111111111111111111111011 //取反
  set & ~subset =  0b0000000000000000000000000001010 // 取与删除后的通道值