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 }`);
}
}