函数原型
export function getHighestPriorityLane(lanes: Lanes): Lane {
return lanes & -lanes;
}
在 React 源码中,getHighestPriorityLane
函数用于计算给定 lanes
中优先级最高的通道(lane)。
背景
React 使用“lanes”来表示不同的任务或更新的优先级。每个“lane”可以看作是一个位(bit),而多个“lanes”则是一个位掩码(bitmask),其中每个位代表一个特定的优先级通道。
输入:
lanes
是一个数字,表示多个优先级 lane 的组合。它是一个位掩码,其中每个位代表一个独立的 lane。
操作:
-lanes
是对lanes
的按位取反加一(即二进制补码运算)。这个操作可以有效地提取出最右边的 1 位(最低有效位),也就是优先级最高的 lane。lanes & -lanes
的结果是一个新的位掩码,其中只有最右边的 1 位被保留,其他位被清零。这代表了lanes
中优先级最高的 lane。
输出:
返回值是一个数字,表示
lanes
中优先级最高的那个 lane。
为什么这样做?
lanes & -lanes 是一种常见的位操作技术,用于快速找到一个二进制数中最右边的 1 位。这在处理优先级队列时非常有用,因为它允许我们快速识别最高优先级的任务。
示例
假设 lanes
是二进制的 10100
:
-lanes
计算为二进制的01100
。lanes & -lanes
结果为00100
,即最右边的 1 位。
因此,这个操作提取出了 10100
中优先级最高的 lane,即 00100
。
二进制补码表示法
最高有效位(MSB):
如果 MSB 是
0
,则这个数是正数或零。如果 MSB 是
1
,则这个数是负数。
正数表示:
正数在二进制补码中与其原码(即普通的二进制表示)相同。例如,
5
在 8 位表示中是00000101
。
负数表示:
负数的表示是通过对其绝对值取反并加 1 来实现的。例如,
-5
的绝对值是5
,其二进制是00000101
。取反得到11111010
,加 1 得到11111011
,这就是-5
的补码表示。
示例
正数:
5
的 8 位表示是00000101
,MSB 是0
,所以是正数。负数:
-5
的 8 位补码表示是11111011
,MSB 是1
,所以是负数。
为什么使用二进制补码?
简化运算: 二进制补码使得加法和减法可以使用相同的电路来实现,因为减法可以转换为加法(通过加上负数的补码)。
唯一的零表示: 二进制补码表示法有一个唯一的零(
00000000
),而不是像一些其他表示法那样有正零和负零。简单的符号判断: 通过检查 MSB 就可以快速判断一个数的符号。
二进制补码表示法是一种高效且简洁的表示有符号整数的方法,因此广泛应用于现代计算机体系结构中。