El módulo de operación aritmética
Sábado, 31 de mayo 2008 La "forma" es una operación matemática disponible en casi todos los lenguajes de programación (He utilizado la primera vez con base en el Commodore 64) . Puede aparecer como un operador simple, como en el caso de ActionScript o JavaScript que ambos utilizan el carácter de "por ciento" (a% b), o como un método o la educación. Desarrollador puede ser útil en contextos aparentemente diferentes. Gskinner habló recientemente, que muestra algunos ejemplos clásicos pero interesante.
De manera simplista, el módulo de dos números devuelve el resto de su división. Por exhaustividad, podemos decir que el módulo de transacciones es un tema muy amplio, lo que he tratado en el cifrado RSA! Esta vez, sin embargo, no se habla de códigos o cifrados, pero útil y mucho más simple.
Divisible por Alternativa ...
El primer uso que podemos hacer que el módulo de transacción para determinar si un número es divisible por un número b! Si risultatto de un% b (% voy a utilizar aquí la notación para indicar el funcionamiento del módulo) es cero, es divisible por b. Recuerdo que cuando tenía que ver con un problema como no sabía el módulo de transacción. Commodore 64 que necesitaba saber si un número es divisible por 2. En el momento en que utiliza esta sintaxis (he encontrado el código original - en el año 1983):
- 10 INPUT A
- : IF B = INT ( B ) THEN PRINT "OK IL NUMERO " A " E' PARI" :GOTO 10 12 B = A / 2: Si B = INT (B) THEN PRINT "EL NUMERO OK" A "Y" EQUAL ": GOTO 10
- A " E' DISPARI" :GOTO 10 14 Imprimir el número "A" y "Odd": GOTO 10
BASIC en el Commodore 64, sin embargo, no tienen la forma de transacción - por lo menos que yo recuerde!
Básicamente lo que estaba haciendo exactamente lo que por su naturaleza, hace que la operación de la forma: Compruebe que la división por 2 no de descanso, en este caso, comprobar que el resultado no contienen un decimal IF B = INT(B) Si la operación de división es igual a su totalidad, entonces el número es igual!
Si en a valor que tenemos nuestro propio control, lo mismo puede ser resuelto por:
- a % 2 ) == 0 ) { if ((a% 2) == 0) (
- / / Igualdad de
- )
O, para el 3, por:
- a % 3 ) == 0 ) { if ((a% 3) == 0) (
- / / Divisible por 3
- )
Pequeña nota: gracias a la pista si tiene que ver con las potencias de 2 es annche una manera más rápida para comprobar si un número es par o impar. En notación binaria, de hecho, los números pares tienen el primer bit a cero! Así, utilizando los operadores lógicos, se puede saber si un número es par o impar simplemente "protestantes", el primer bit:
- ! ( a & 1 ) ) { if ((v + 1)) (
- / / Igualdad de
- )
En la Asamblea, por ejemplo, este es nuestro pan de cada día! Es aún más inmediata y simple (el Motorola 68020, por ejemplo, tuvo un BTST instrucción que "probado" un poco sola
). Las operaciones lógicas (AND, OR, NOT, XOR, etc ...), en realidad, son conocidos por ser más rápido en ejecución y por tanto, la "máquina del tiempo"! (a & 1) realiza la operación lógica de AND & - multiplicando bit a bit) entre nuestro valor a y 1 (denominado máscara). Si a = 7 (00000111), por ejemplo:
- 00000111 Y
- = 00000001
- 00000001; impar
Si a 8 =:
- 00001000 Y
- = 00000001
- 00000000; la igualdad de
No sólo podemos verificar los números pares, es decir, el primer bit a 0, y por lo tanto divisible por 2, pero también puede ocurrir si un número es divisible por 4, 8, 16, 32, 64, etc ... utilizando los formularios correspondientes:
- ! ( a & 3 ) ) { if ((A & 3)) (
- / / Divisible por 4 (= 3 mask = 00000011) desde el 4 es 00000100)
- )
Si los dos últimos bits son iguales a cero el número es divisible por 4! Si los últimos 3 bits (máscara 00000111) están en cero el número es divisible por 8! Y así ![]()
Gskinner muestra el uso del módulo en el caso de la generación de valores alternativos. Ejemplo clásico es cambiar el fondo de una lista de elementos: un blanco y gris. Gskinner propone:
- rowIndex % 2 == 0 ) { if (% rowIndex 2 == 0) (
- rowColor = 0xFFFFFF;
- { ) Else (
- = rowColor 0xCCCCCC;
- )
Primero de todo el código anterior se puede resolver con una sola línea de código:
- 2 == 0 ) ? 0xFFFFFF : 0xCCCCCC ; rowColor = (% rowIndex 2 == 0)? 0xFFFFFF: 0xCCCCCC;
Además, en este caso particular, quiero evitar el actual ejercicio de un "pesado" módulo de operación. Esta situación particular es a menudo participan en bucle, y por lo tanto sería "derecho a no" perder ciclos de reloj de la máquina. En estos casos me gusta la limpieza (y lógico) la solución:
- fooIndex == false ) ) ? 0xFFFFFF : 0xCCCCCC ; = rowColor (fooIndex = (fooIndex == false))? 0xFFFFFF: 0xCCCCCC;
Cuando fooIndex es un valor establecido en precedentemete true o false dependiendo de la forma en que inicialmente nuestro color de fondo. Este enfoque es más sutil y menos inmediata, al principio, pero más rápido, ya que realiza operaciones lógicas de verdadero / falso. Si la fooIndex es cierto cuando se ejecuta la instrucción (fooIndex = (fooIndex == false) ) la condición (fooIndex == false) fooIndex es falso y por lo tanto se establece de true a false. La segunda vez, sin embargo, fooIndex la condición (fooIndex == false) será verdadero y, a continuación se establece de falso a verdadero! Y así sucesivamente ...
Tarea: El comportamiento de ver
La aritmética más, que subyace a las funciones de la forma, se refiere a menudo como la aritmética del reloj. Un reloj de reloj clásico tiene un dial dividido en 12 horas (12 días más 12 la noche!), Suficiente para indicar una de cada 24 horas del día. A las 08:00 am Si usted preguntar a qué hora su reloj puntuación de entre 18 horas, su respuesta sería: 8 +18 = 26! Pero la 02:00 de la noche! Tal vez sin querer y sin saberlo, llevamos a cabo operaciones de forma conitnuamente cuando tratamos con el calendario.
En Italia se utilizan para el sistema de 24 horas (o mixto). Cuando el punto de las 16:00 intención quell'orario que en otros países que se indica como 04:00 pm. ¿Quién está usando postfix am / pm Diuna hora de distinguir de los de la noche, corriendo más a menudo el módulo de transacción, en este caso la forma 12! Los italianos, y otros, sin embargo, estar acostumbrado a considerar las 24 horas, realizar operaciones con el Formulario 24!
Cuando son las 11 am (11:00 para todos) y que de "entre 5 horas", los italianos responden 5 +11 = 16 (cuatro de la tarde), los extranjeros también pueden responder 5 11 = 4 horas. Desde el 5 + 11, la aritmética clásica, es, obviamente, 16, al igual que el extranjero para cumplir con 4 PM? Simplemente ejecute el módulo 12 en el resultado: 5 + 11 = 16 mod 12 = 4. No es necesario que se tome una calculadora para comprobar la exactitud de cálculo, pero todas estas medidas, un poco 'un'orologio muestra una cara de la actitud mental y las manos en el 11, a continuación, añadir - siempre visualmente - 5 horas y, como por arte de magia que usted realmente cerca de 4! Es por eso que las cuatro de la tarde se llamó a 16 ![]()
En Italia, sin embargo, se utiliza un formulario 24, de hecho: 11 +5 = 16 mod 24 = 16. Cuando estoy a las 23:00 horas, después de 5 horas no será el 28:00, 28 por módulo 12 = 4! 122514884225 Formulario 24 = 17! Lo que pasa es que nunca la figura del módulo 24 resultado supera las 24. Pero lo más interesante es que los números se repiten indefinidamente:
- = 1 1% 24 = 1
- = 2 2% 24 = 2
- = 3 3% 24 = 3
- ...
- = 22 22% 24 = 22
- = 23 23% 24 = 23
- = 0 24% 24 = 0
- = 1 25% 24 = 1
- = 2 26% 24 = 2
- = 3 27% 24 = 3
- ...
- = 0 48% 24 = 0
- = 1 49% 24 = 1
- = 2 50% 24 = 2
- = 3 51% 24 = 3
- ...
Esta repetición es un consuelo desarme. Imaginemos, por ejemplo, que debe tener un objeto, un MovieClip, como un tablero de ajedrez, en cuatro columnas. Crear un quandrato MovieClip, 55x55 píxeles y la propiedad esportiamolo panel con el Simbolo El siguiente código tendrá nuestro MovieClip en cuatro columnas, y hará que la película gracias a la operación del módulo:
Como se muestra en el código, el i la variable del ciclo for cultivo de forma indefinida. Sin embargo, la coordenada x de nuestra MovieClip nunca supera un determinado valor, y se repite indefinidamente! Aquí está un ejemplo concreto:
Usando los dos botones que usted puede variar el número de columnas (módulo) y el número total de elementos, utilizando el algoritmo de adelantamientos.













[...] Http: / / www.undolog.com/2008/05/31/loperazione-aritmetica-modulo/ http://stackoverflow.com/questions/1054657/memory-alignment-on-a-32-bit -procesador Intel [...]