Los operadores bit a bit siempre convierten sus operandos a un número entero. Entonces, 4 >> truees lo mismo 4 >> 1que hará un poco de cambio en una posición
(decimal) 4 = (binary) 100
(binary) 100 >> 1 = (binary) 010
(binary) 010 = (decimal) 2
Entonces, usar trueo falsees solo una forma indirecta de usar 1o 0.
La notNotNotfunción tiene una operación muy simple, en general:
a%2convierte el primer número en 0par o 1impar.
>> bdesplaza a la derecha por 0posiciones para falseo 1posición para true.
aes impar (1) y bes false=1
- hay cero desplazamientos a la derecha, por lo que el número sigue siendo el mismo.
aes impar (1) y bes true=0
- el único bit establecido
1se desplaza hacia la derecha y se descarta.
aes par (0) y bes false=0
- hay cero desplazamientos a la derecha, por lo que el número sigue siendo el mismo.
aes par (0) y bes true=0
- el número base es el
0que no tiene ningún bit establecido, por lo que desplazar a la derecha cualquier cantidad no lo cambia.
!!() convierte el resultado a booleano.
Dicho esto, la solución aquí es incorrecta, ya notNotNot(2, true)que producirá false, aes uniforme y bes true. La expectativa es que producirá truedesde entonces !!true = true. El mismo problema está presente para cualquier número par y true.
Se puede arreglar fácilmente usando XOR bit a bit en lugar del desplazamiento a la derecha:
aes impar (1) y bes false=1
- ambos coinciden, por lo que se cambian a
0
aes impar (1) y bes true=0
- no coinciden, así que obtenemos
1
aes par (0) y bes false=0
- ambos coinciden, así que obtenemos
0
aes par (0) y bes true=1
- no coinciden, así que obtenemos
1
notNotNot = (a,b) => !!(a%2 ^ b);
console.log("!!true = ", notNotNot(2, true))
console.log("!!!true =", notNotNot(3, true))
console.log("!!false = ", notNotNot(2, false))
console.log("!!!false = ", notNotNot(3, false))
//bonus
console.log("true = ", notNotNot(0, true))
console.log("false = ", notNotNot(0, false))
Solo por completo, en caso de que desee una operación totalmente bit a bit:
La operación del módulo %2se puede cambiar a bit a bit Y &1obtener el bit más bajo. Para números pares, esto produciría 0ya que estarías calculando
xxx0
&
0001
que es cero Y para números impares se aplica lo mismo, pero como resultado obtendría uno:
xxx1
&
0001
Entonces los resultados de a&1y a%2son idénticos. Además, a pesar de que las operaciones bit a bit convierten el número a un entero con signo de 32 bits que no importa, ya que se preservaría la paridad .
//larger than 31 bits
const largeValue = 2**31 + 1;
//larger than 32 bits
const veryLargeValue = 2**32 + 1
console.log("2**31 + 1 =", largeValue);
console.log("2**32 + 1 =", veryLargeValue);
console.log("2**31 + 1 to 32-bit signed integer =", largeValue | 0);
console.log("2**32 + 1 to 32-bit signed integer = ", veryLargeValue | 0);
const isOddModulo = number =>
console.log(`(${number} % 2) can detect an odd number: ${(number % 2) === 1}`);
const isOddBitwise = number =>
console.log(`(${number} & 1) can detect an odd number: ${(number & 1) === 1}`);
isOddModulo(largeValue);
isOddBitwise(largeValue);
isOddModulo(veryLargeValue);
isOddBitwise(veryLargeValue);
true=1(decimal) =01(binario) desplazado a la izquierda por uno produciría10binario o2decimal.