Búsqueda de sitios web

angular - Operaciones bit a bit en Typescript


Leyendo un artículo sobre el mecanismo de detección de cambios de Angular, me encontré con este código de TypeScript:

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

He estado tratando de entender esa línea de código.

Conozco el truco ~ y cómo se usa con indexOf(). Me resulta difícil de entender en términos de bits, pero recordar que se puede reemplazar con -(x+1), haciendo que solo -1 sea falso, lo hace más fácil.

Parece que ViewState.ChecksEnabled es un booleano, así que ~ViewState.ChecksEnabled da -(0 + 1) o -(1 + 1)

Luego, con la asignación bit a bit &= (?) obtenemos

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

¿Cuál es el truco aquí?

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

Respuesta #1

Creo que deberías ver esto como cálculo binario.

supongamos que el _view.state es igual a 1, y el ViewState.ChecksEnabled es igual a 1.

Tenemos dos operadores a nivel de bits:

  • & realizará una operación AND en los bits correspondientes que sean iguales a 1
  • ~ invertirá los bits

Entonces, con la "reescritura" de la operación, tenemos:

var = 1 & ~ 1

Aplicamos la tilde :

var = 1 & 0

Entonces el Y :

var = 0

Lo que daría un cero simple. Si aplicas esto con _view.state igual a 0, eso daría:

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

Cuando usas 0, 0 :

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

Y 1, 0 :

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

Así que, para resumir:

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

También puedes crear un entorno de prueba para probar eso con varios números:

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

Artículos relacionados