1. 首页
  2. React

React源码中 getHighestPriorityLane ,即通过位运算提取出最低有效位

函数原型

export function getHighestPriorityLane(lanes: Lanes): Lane {
    return lanes & -lanes;
}

在 React 源码中,getHighestPriorityLane 函数用于计算给定 lanes 中优先级最高的通道(lane)。

背景

React 使用“lanes”来表示不同的任务或更新的优先级。每个“lane”可以看作是一个位(bit),而多个“lanes”则是一个位掩码(bitmask),其中每个位代表一个特定的优先级通道。

  1. 输入:

    • lanes 是一个数字,表示多个优先级 lane 的组合。它是一个位掩码,其中每个位代表一个独立的 lane。

  2. 操作:

    • -lanes 是对 lanes 的按位取反加一(即二进制补码运算)。这个操作可以有效地提取出最右边的 1 位(最低有效位),也就是优先级最高的 lane。

    • lanes & -lanes 的结果是一个新的位掩码,其中只有最右边的 1 位被保留,其他位被清零。这代表了 lanes 中优先级最高的 lane。

  3. 输出:

    • 返回值是一个数字,表示 lanes 中优先级最高的那个 lane。

为什么这样做?

lanes & -lanes 是一种常见的位操作技术,用于快速找到一个二进制数中最右边的 1 位。这在处理优先级队列时非常有用,因为它允许我们快速识别最高优先级的任务。

示例

假设 lanes 是二进制的 10100

  • -lanes 计算为二进制的 01100

  • lanes & -lanes 结果为 00100,即最右边的 1 位。

因此,这个操作提取出了 10100 中优先级最高的 lane,即 00100

二进制补码表示法

  1. 最高有效位(MSB):

    • 如果 MSB 是 0,则这个数是正数或零。

    • 如果 MSB 是 1,则这个数是负数。

  2. 正数表示:

    • 正数在二进制补码中与其原码(即普通的二进制表示)相同。例如,5 在 8 位表示中是 00000101

  3. 负数表示:

    • 负数的表示是通过对其绝对值取反并加 1 来实现的。例如,-5 的绝对值是 5,其二进制是 00000101。取反得到 11111010,加 1 得到 11111011,这就是 -5 的补码表示。

示例

  • 正数: 5 的 8 位表示是 00000101,MSB 是 0,所以是正数。

  • 负数: -5 的 8 位补码表示是 11111011,MSB 是 1,所以是负数。

为什么使用二进制补码?

  1. 简化运算: 二进制补码使得加法和减法可以使用相同的电路来实现,因为减法可以转换为加法(通过加上负数的补码)。

  2. 唯一的零表示: 二进制补码表示法有一个唯一的零(00000000),而不是像一些其他表示法那样有正零和负零。

  3. 简单的符号判断: 通过检查 MSB 就可以快速判断一个数的符号。

二进制补码表示法是一种高效且简洁的表示有符号整数的方法,因此广泛应用于现代计算机体系结构中。


TOP