Typescript中的按位运算

时间:2019-02-18 08:36:36

标签: angular typescript

在阅读有关Angular的更改检测机制的文章时,我遇到了此打字稿代码:

detach(): void { this._view.state &= ~ViewState.ChecksEnabled; }

我一直在努力把那行代码缠起来。

我知道~的窍门以及它与indexOf()一起使用的方式。我发现很难用位来理解,但要记住可以用-(x+1)代替它,因此仅使-1 falsy变得更容易。

似乎ViewState.ChecksEnabled是布尔值,因此~ViewState.ChecksEnabled给出-(0 + 1)或-(1 + 1)

然后按&=按位分配(?),我们得到

this._view.state = this._view.state & -1; // or -2

这有什么窍门?

https://github.com/angular/angular/blob/6b79ab5abec8b5a4b43d563ce65f032990b3e3bc/packages/core/src/view/view.ts#L346

1 个答案:

答案 0 :(得分:3)

我认为您应该将此视为二进制演算。

让我们假设_view.state等于1,而ViewState.ChecksEnabled等于1。

我们有两个按位运算符:

  • &将对等于1的对应位执行AND操作
  • ~将反转位

因此,通过操作的“重写”,我们可以:

var = 1 & ~ 1

我们应用波浪号:

var = 1 & 0

然后输入AND:

var = 0

哪个给出纯零。如果您在_view.state等于0的情况下应用此代码,则将得出:

var = 0 & ~1 = 0 & 0 = 0

当您使用0,0时:

var = 0 & ~0 = 0 & 1 = 0

和1,0:

var = 1 & ~0 = 1 & 1 = 1

所以总结一下:

0, 0 → 0
0, 1 → 0
1, 0 → 1
1, 1 → 0

您还可以创建一个沙箱来测试几个数字:

for (const i of [0, 1, 2, 3, 4]) {
  for (const j of [0, 1, 2, 3, 4]) {
    console.log(`${i} & ~${j} = ${ i & ~j }`);
  }
}