Skip to content

02.二进制的计算

理解下面这个函数的计算

关于js中数字的位数

在 JavaScript 中,数字(无论是整数还是浮点数)在内存中的表示是 64 位双精度浮点数格式。 当使用 JavaScript 进行位运算(例如按位与、按位或等)时,操作数会临时被视为有符号的 32 位整数来处理,并按照这种格式进行计算。

lane模型中的二进制表示

js
export const NoLanes= 0b0000000000000000000000000000000;
export const NoLane=0b0000000000000000000000000000000;
export const SyncHydrationLane = 0b0000000000000000000000000000001;
export const SyncLane = 0b0000000000000000000000000000010;
...

二进制的计算 (与、或、非、取反、异或、左移、右移...)

我们主要掌握,与、或、取反

js
//  与运算
  0b0000001000000000000000000000000
& 0b0000010000000000000000000000000
-----------------------------------
  0b0000000000000000000000000000000
// 或运算
  0b0000001000000000000000000000000 A
| 0b0000010000000000000000000000000 B
-----------------------------------
  0b0000011000000000000000000000000 C
// 取反运算
~ 0b0000001000000000000000000000000
-----------------------------------
  0b1111110111111111111111111111111
js
// 案例一: 清除标记
finishedWork.flags &= ~Placement;
//类比:C = C & ~B
  0b0000011000000000000000000000000  C
& 0b1111101111111111111111111111111 ~B
-------------------------------------
  0b0000001000000000000000000000000
js
// 案例二:获取最右侧的1代表的值
A & -A

// ~A
0b0000011000000000000000000000000   A
---------------------------------------------
  0b1111100111111111111111111111111A

// ~A + 1
  0b1111100111111111111111111111111A
+ 0b0000000000000000000000000000001   1
---------------------------------------------
  0b0000001000000000000000000000000A + 1 

// A & (~A + 1)
  0b0000001000000000000000000000000A + 1 
& 0b0000011000000000000000000000000   A
---------------------------------------------
  0b0000001000000000000000000000000   A & (~A + 1=== A & -A

基于 VitePress 构建