rotacion operadores manipulacion manejo ejemplos derecha corrimiento c math bit-manipulation bitwise-operators bitwise-and

manipulacion - Mod de potencia 2 en operadores bitwise?



operadores de bits javascript (5)

  1. ¿Cómo funciona la mod de potencia de 2 solo en los bits de orden inferior de un número binario ( 1011000111011010 )?
  2. ¿Cuál es este número mod 2 para alimentar 0, 2 para alimentar 4?
  3. ¿Qué tiene que ver la potencia de 2 con el operador de módulo? ¿Tiene una propiedad especial?
  4. ¿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:

  1. 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.
  2. 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).
  3. 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.
  4. Ejemplo: Ver respuesta a la pregunta 2.