manipulacion - Mod de potencia 2 en operadores bitwise?
operadores de bits javascript (5)
- ¿Cómo funciona la mod de potencia de 2 solo en los bits de orden inferior de un número binario (
1011000111011010
)? - ¿Cuál es este número mod 2 para alimentar 0, 2 para alimentar 4?
- ¿Qué tiene que ver la potencia de 2 con el operador de módulo? ¿Tiene una propiedad especial?
- ¿Puede alguien darme un ejemplo?
El instructor dice: "Cuando tomas algo de mod a potencia de 2, solo tomas los bits de orden inferior". Tenía mucho miedo de preguntar qué quería decir =)
Considera cuándo tomas un número módulo 10. Si haces eso, solo obtienes el último dígito del número.
334 % 10 = 4
12345 % 10 = 5
Del mismo modo, si tomas un número 100 de módulo, solo obtienes los dos últimos dígitos.
334 % 100 = 34
12345 % 100 = 45
Así que puedes obtener el módulo de una potencia de dos mirando sus últimos dígitos en binario. Eso es lo mismo que hacer un bit a bit y.
Lo que quiere decir es que
x modulo y = (x & (y − 1))
Cuando y es una potencia de 2.
Ejemplo:
0110010110 (406) modulo
0001000000 (64) =
0000010110 (22)
^^^^<- ignore these bits
Usando tu ejemplo ahora:
1011000111011010 (45530) modulo
0000000000000001 (2 power 0) =
0000000000000000 (0)
^^^^^^^^^^^^^^^^<- ignore these bits
1011000111011010 (45530) modulo
0000000000010000 (2 power 4) =
0000000000001010 (10)
^^^^^^^^^^^^<- ignore these bits
Módulo en general devuelve el resto de un valor después de la división. Entonces, x mod 4
, por ejemplo, devuelve 0, 1, 2 o 3 dependiendo de x. Estos posibles valores pueden representarse usando dos bits en binario (00, 01, 10, 11) - otra forma de hacer x mod 4
es simplemente poner todos los bits a cero en x, excepto los dos últimos.
Ejemplo:
x = 10101010110101110
x mod 4 = 00000000000000010
Quiso decir que tomar el number mod 2^n
es equivalente a eliminar todos los bits excepto los n
de orden más bajo (más a la derecha) .
Por ejemplo, si n == 2,
number number mod 4
00000001 00000001
00000010 00000010
00000011 00000011
00000100 00000000
00000101 00000001
00000110 00000010
00000111 00000011
00001000 00000000
00001001 00000001
etc.
En otras palabras, el number mod 4
es el mismo que el number & 00000011
(donde &
significa bitwise-and)
Tenga en cuenta que esto funciona exactamente igual en base 10: el number mod 10
le da el último dígito del número base 10, el number mod 100
le da los dos últimos dígitos, etc.
Respondiendo a sus preguntas específicas:
- mod es un operador de resto. Si se aplica a una serie de números x en 0, 1, ..., entonces x mod n será 0, 1, ..., n-1, 0, 1, ..., n-1, ad infinitum. Cuando su módulo n es una potencia de 2, entonces x mod n contará en binario de 0 a n-1, de vuelta a 0, a n-1, etc .; para el módulo n que parece binario 01xxxxx, x mod n realizará un ciclo a través de cada uno de esos bits de orden inferior xxxxx.
- binario 1011000111011010 mod 1 es 0 (mod 2 ^ 0 produce los últimos bits cero; todo mod 1 es cero). binario 1011000111011010 mod binario 10000 es 1010 (mod 2 ^ 4 produce los últimos cuatro bits).
- La división y el resto del número binario por potencias de dos es particularmente eficiente porque solo está cambiando y enmascarando; Matemáticamente no es nada especial.
- Ejemplo: Ver respuesta a la pregunta 2.