Typescript 中的按位运算

gyc*_*gyc 3 typescript angular

阅读一篇有关 Angular 变更检测机制的文章时,我遇到了以下打字稿代码:

detach(): void { this._view.state &= ~ViewState.ChecksEnabled; }
Run Code Online (Sandbox Code Playgroud)

我一直在努力理解那行代码。

我知道这个~技巧以及它如何与 一起使用indexOf()。我发现很难用位来理解,但记住它可以被替换为-(x+1)-1 假值,这样就更容易了。

它似乎ViewState.ChecksEnabled是一个布尔值,所以~ViewState.ChecksEnabled给出 -(0 + 1) 或 -(1 + 1)

然后通过&=按位赋值(?)我们得到

this._view.state = this._view.state & -1; // or -2
Run Code Online (Sandbox Code Playgroud)

这里有什么技巧呢?

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

小智 5

我认为你应该将其视为二进制微积分。

\n\n

假设_view.state等于 1,并且ViewState.ChecksEnabled等于 1。

\n\n

我们有两个按位运算符:

\n\n
    \n
  • &将对等于 1 的相应位执行 AND 运算
  • \n
  • ~将反转位
  • \n
\n\n

因此,通过“重写”操作,我们有:

\n\n
var = 1 & ~ 1\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们应用波形符:

\n\n
var = 1 & 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后是“与”:

\n\n
var = 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将给出一个简单的零。如果你应用这个_view.state等于 0,则会给出:

\n\n
var = 0 & ~1 = 0 & 0 = 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

当您使用 0, 0 时:

\n\n
var = 0 & ~0 = 0 & 1 = 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

和 1, 0 :

\n\n
var = 1 & ~0 = 1 & 1 = 1\n
Run Code Online (Sandbox Code Playgroud)\n\n

总结一下:

\n\n
0, 0 \xe2\x86\x92 0\n0, 1 \xe2\x86\x92 0\n1, 0 \xe2\x86\x92 1\n1, 1 \xe2\x86\x92 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

\r\n\r\n
\r\n

\n