Artículos

2.8: Multiplicar y dividir enteros (Parte 2)


Evaluar expresiones variables con números enteros

Ahora podemos evaluar expresiones que incluyen multiplicación y división con números enteros. Recuerde que para evaluar una expresión, sustituya los números en lugar de las variables y luego simplifique.

Ejemplo ( PageIndex {10} ): evaluar

Evalúa (2x ^ 2 - 3x + 8 ) cuando (x = −4 ).

Solución

Sustituye ( textcolor {red} {- 4} ) por x. (2 ( textcolor {rojo} {- 4}) ^ {2} - 3 ( textcolor {rojo} {- 4}) + 8 )
Simplifica exponentes.(2(16) - 3(-4) + 8)
Multiplicar.(32 - (-12) + 8)
Sustraer.(44 + 8)
Agregar.(52)

Tenga en cuenta que cuando sustituimos (- 4 ) por (x ), usamos paréntesis para mostrar la multiplicación. Sin paréntesis, se vería como (2 • −4 ^ 2 - 3 • −4 + ​​8 ).

Ejercicio ( PageIndex {19} )

Evaluar: (3x ^ 2 - 2x + 6 ) cuando (x = −3 )

Respuesta

(39)

Ejercicio ( PageIndex {20} )

Evaluar: (4x ^ 2-x-5 ) cuando (x = −2 )

Respuesta

(13)

Ejemplo ( PageIndex {11} ): evaluar

Evalúa (3x + 4y - 6 ) cuando (x = −1 ) y (y = 2 ).

Solución

Sustituya x = ( textcolor {rojo} {- 1} ) y y = ( textcolor {azul} {2} ). (3 ( textcolor {rojo} {- 1}) + 4 ( textcolor {azul} {2}) - 6 )
Multiplicar.(-3 + 8 - 6)
Simplificar.(-1)

Ejercicio ( PageIndex {21} )

Evaluar: (7x + 6y - 12 ) cuando (x = −2 ) y (y = 3 )

Respuesta

(-8)

Ejercicio ( PageIndex {22} )

Evaluar: (8x - 6y + 13 ) cuando (x = −3 ) y (y = −5 )

Respuesta

(19)

Traducir frases de palabras a expresiones algebraicas

Una vez más, todo nuestro trabajo previo de traducción de palabras al álgebra se transfiere a frases que incluyen tanto la multiplicación como la división de números enteros. Recuerda que la palabra clave para multiplicar es producto y para la división es cociente.

Ejemplo ( PageIndex {12} ): traducir

Traducir a una expresión algebraica y simplificar si es posible: el producto de (- 2 ) y (14 ).

Solución

La palabra producto nos dice que nos multipliquemos.

Traducir.(−2)(14)
Simplificar.−28

Ejercicio ( PageIndex {23} )

Traducir a una expresión algebraica y simplificar si es posible: el producto de (- 5 ) y (12 )

Respuesta

(-5(12)=-60)

Ejercicio ( PageIndex {24} )

Traducir a una expresión algebraica y simplificar si es posible: el producto de (8 ) y (- 13 )

Respuesta

(8(-13)=-104)

Ejemplo ( PageIndex {13} )

Traduce a una expresión algebraica y simplifica si es posible: el cociente de (- 56 ) y (- 7 ).

Solución

La palabra cociente nos dice que nos dividamos.

Traducir.−56 ÷ (−7)
Simplificar.8

Ejercicio ( PageIndex {25} )

Traducir a una expresión algebraica y simplificar si es posible: el cociente de (- 63 ) y (- 9 )

Respuesta

(- 63 div -9 = 7 )

Ejercicio ( PageIndex {26} )

Traducir a una expresión algebraica y simplificar si es posible: el cociente de (- 72 ) y (- 9 )

Respuesta

(- 72 div -9 = 8 )

Conceptos clave

  • Multiplicación de números con signo
    • Para determinar el signo del producto de dos números con signo:
      Mismos SignosProducto
      Dos positivos
      Dos negativos
      Positivo
      Positivo
      Diferentes signosProducto
      Positivo negativo
      Negativo positivo
      Negativo
      Negativo
  • División de números firmados
    • Para determinar el signo del cociente de dos números con signo:
      Mismos SignosCociente
      Dos positivos
      Dos negativos
      Positivo
      Positivo
      Diferentes signosCociente
      Positivo negativo
      Negativo positivo
      Negativo
      Negativo
  • Multiplicación por (- 1 )
    • Multiplicar un número por (- 1 ) da su opuesto: (- 1a = -a )
  • División por (- 1 )
    • Dividir un número por (- 1 ) da su opuesto: (a div (-1) = -a )

La práctica hace la perfección

Multiplicar enteros

En los siguientes ejercicios, multiplique cada par de números enteros.

  1. −4 • 8
  2. −3 • 9
  3. −5(7)
  4. −8(6)
  5. −18(−2)
  6. −10(−6)
  7. 9(−7)
  8. 13(−5)
  9. −1 • 6
  10. −1 • 3
  11. −1(−14)
  12. −1(−19)

Dividir enteros

En los siguientes ejercicios, divida.

  1. −24 ÷ 6
  2. −28 ÷ 7
  3. 56 ÷ (−7)
  4. 35 ÷ (−7)
  5. −52 ÷ (−4)
  6. −84 ÷ (−6)
  7. −180 ÷ 15
  8. −192 ÷ 12
  9. 49 ÷ (−1)
  10. 62 ÷ (−1)

Simplificar expresiones con números enteros

En los siguientes ejercicios, simplifique cada expresión.

  1. 5(−6) + 7(−2)−3
  2. 8(−4) + 5(−4)−6
  3. −8(−2)−3(−9)
  4. −7(−4)−5(−3)
  5. (−5)3
  6. (−4)3
  7. (−2)6
  8. (−3)5
  9. −42
  10. −62
  11. −3(−5)(6)
  12. −4(−6)(3)
  13. −4 • 2 • 11
  14. −5 • 3 • 10
  15. (8 − 11)(9 − 12)
  16. (6 − 11)(8 − 13)
  17. 26 − 3(2 − 7)
  18. 23 − 2(4 − 6)
  19. −10(−4) ÷ (−8)
  20. −8(−6) ÷ (−4)
  21. 65 ÷ (−5) + (−28) ÷ (−7)
  22. 52 ÷ (−4) + (−32) ÷ (−8)
  23. 9 − 2[3 − 8(−2)]
  24. 11 − 3[7 − 4(−2)]
  25. (−3)2−24 ÷ (8 − 2)
  26. (−4)2 − 32 ÷ (12 − 4)

Evaluar expresiones variables con números enteros

En los siguientes ejercicios, evalúe cada expresión.

  1. −2x + 17 cuando (a) x = 8 (b) x = −8
  2. −5y + 14 cuando (a) y = 9 (b) y = −9
  3. 10-3m cuando (a) m = 5 (b) m = −5
  4. 18 - 4n cuando (a) n = 3 (b) n = −3
  5. pag2 - 5p + 5 cuando p = −1
  6. q2 - 2q + 9 cuando q = −2
  7. 2 semanas2 - 3w + 7 cuando w = −2
  8. 3u2 - 4u + 5 cuando u = −3
  9. 6x - 5y + 15 cuando x = 3 e y = −1
  10. 3p - 2q + 9 cuando p = 8 y q = −2
  11. 9a - 2b - 8 cuando a = −6 y b = −3
  12. 7m - 4n - 2 cuando m = −4 y n = −9

Traducir frases de palabras a expresiones algebraicas

En los siguientes ejercicios, traduzca a una expresión algebraica y simplifique si es posible.

  1. El producto de −3 y 15
  2. El producto de −4 y 16
  3. El cociente de −60 y −20
  4. El cociente de −40 y −20
  5. El cociente de −6 y la suma de a y b
  6. El cociente de −7 y la suma de my n
  7. El producto de −10 y la diferencia de p y q
  8. El producto de −13 y la diferencia de c y d

Matemáticas cotidianas

  1. Bolsa de Valores Javier posee 300 acciones de una empresa. El martes, el precio de las acciones cayó 12 dólares por acción. ¿Cuál fue el efecto total en la cartera de Javier?
  2. Pérdida de peso En la primera semana de un programa de dieta, ocho mujeres perdieron un promedio de 3 libras cada una. ¿Cuál fue el cambio de peso total para las ocho mujeres?

Ejercicios de escritura

  1. En sus propias palabras, establezca las reglas para multiplicar dos números enteros.
  2. En sus propias palabras, establezca las reglas para dividir dos números enteros.
  3. ¿Por qué es −24 ≠ (−2)4 ?
  4. ¿Por qué es −42 ≠ (−4)2 ?

Autochequeo

(a) Después de completar los ejercicios, use esta lista de verificación para evaluar su dominio de los objetivos de esta sección.

(b) En una escala del 1 al 10, ¿cómo calificaría su dominio de esta sección a la luz de sus respuestas en la lista de verificación? ¿Cómo puedes mejorar esto?


Tabla de Maharashtra Clase 7 Soluciones matemáticas Capítulo 2 Multiplicación y división de enteros Conjunto de práctica 8

  1. (-5) × (-7)
  2. (-9) × (6)
  3. (9) × (-4)
  4. (8) × (-7)
  5. (-124) × (-1)
  6. (-12) × (-7)
  7. (-63) × (-7)
  8. (-7) × (15)

Tabla de Maharashtra Clase 7 Matemáticas Capítulo 2 Multiplicación y división de enteros Conjunto de práctica 8 Preguntas y actividades de intext

Pregunta 1.
En la clase anterior, hemos aprendido a sumar y restar números enteros. Usando esos métodos, complete los espacios en blanco a continuación. (Libro de texto pág. No. 11)

  1. 5 + 7 = __
  2. 10 + (-5) = __
  3. -4 + 3 = __
  4. (-7) + (-2) = __
  5. (+8) – (+ 3) = __
  6. (+8) – (-3) = __

Pregunta 2.
Escriba un número en cada corchete para obtener la respuesta "3" en cada operación. (Libro de texto pág. No. 11)

Solución:

Pregunta 3.
Multiplica los números enteros dados y completa la tabla que se muestra a continuación. (Libro de texto pág. No. 12)

Solución:


Indicaciones visuales: pregunta 1, acto 1

El comienzo del video solicita al espectador este elemento visual:

Aquí estamos tratando de ayudar al espectador & # 8220ver & # 8221 a los 3 grupos de 4 cuadrados negros. En videos anteriores, representamos los cuadrados negros como números enteros positivos. Por lo tanto, buscamos que el espectador pueda decir y posiblemente escribir:

Como estoy seguro de que los estudiantes que están multiplicando números enteros se sienten cómodos con la multiplicación de 3 x 4, damos este resultado inmediatamente como 12 y lo mostramos en la recta numérica.

También mostramos que podemos reorganizar nuestras agrupaciones para que sean:


Use números primos y factoraje primos

Tenga en cuenta que el número en el símbolo radical debe ser lo más pequeño posible. ¿Cómo podemos hacer esto? Podemos hacer la raíz cuadrada elevando el número entero al cuadrado. De manera similar, si hay un cuadrado en la raíz, podemos convertirlo en un número entero y luego sacarlo del símbolo de la raíz.

No solo podemos hacer una raíz cuadrada a partir de un número entero, sino que también podemos hacer un número entero a partir de parte de la raíz cuadrada. Por ejemplo, tenemos lo siguiente.

¿Cómo podemos encontrar poderes de manera eficiente en el símbolo raíz? El método es la factorización prima. La factorización prima consiste en utilizar números primos para realizar la división.

Los números tienen números primos. Un número primo es un número que es divisible solo por 1 y su número. Los números primos incluyen, por ejemplo, los siguientes.

Por ejemplo, 7 tiene solo 1 y 7 divisores. Del mismo modo, los divisores de 11 son solo 1 y 11. Dividir por cualquier otro número no da como resultado un número entero. Por otro lado, los divisores de 4 son 1, 2 y 4. No solo 1 y 4, sino que 2 también es un divisor. Por tanto, 4 no es un número primo.

Podemos convertir un entero (número natural) en una ecuación de multiplicación dividiéndolo por un número primo. Entender que lo opuesto a los cálculos de multiplicación es la factorización prima.

Cuando pensamos en factorización prima, el término es difícil de entender. Sin embargo, el concepto de factorización prima es simple si lo entiende como una forma de descomponer números en expresiones de multiplicación. Los números primos no pueden ser más divisibles. Entonces, con números primos, podemos convertirlos en multiplicaciones.

¿Cómo hacer la factorización prima? Pasos para multiplicar

¿Cómo hacer la factorización prima? Por ejemplo, intentemos factorizar 300 en números primos.

La forma de hacerlo es dividir en orden desde el número primo más pequeño. El número primo más pequeño es 2. Entonces, vamos a & # 8217s dividir 300 entre 2. Si dividimos 300 entre 2, podemos dividirlo en 2 y 150. $ 300 = 2 × 150 $.

Este método nos permitió hacer una factorización prima una vez. Sin embargo, 150 no es un número primo. Se puede dividir por un número primo. Entonces, vamos a dividirlo nuevamente por un número primo. Dividiendo por 2, obtenemos lo siguiente.

Para 300, divida dos veces por 2 para obtener 75. Es decir, $ 300 = 2 × 2 × 75 $. Sin embargo, 75 no es un número primo. Entonces, dejemos que & # 8217s hagamos más factores primos.

75 no es divisible por 2. Entonces, a continuación, lo dividimos entre 3.

El resultado es $ 300 = 2 × 2 × 3 × 25 $. De la misma manera, también podemos proceder con la factorización prima. 25 no es un número primo y se puede dividir entre 5. Por lo tanto, obtenemos lo siguiente

Dividiendo por los números primos, finalmente encontramos los siguientes hechos.

Dado que 5 es un número primo, no se puede dividir más. En la factorización prima, detenga la división cuando el número primo aparezca al final. Luego, reúna todos los números primos divididos y el último número primo. Dado que multiplica todos los números primos en el círculo en la figura anterior para obtener 300, se completa la factorización prima.

-El símbolo de la factorización prima

Cuando realmente hacemos la factorización prima, tenemos que calcularla de manera eficiente y rápida. Por lo tanto, casi nunca usamos flechas para hacer la factorización prima como se muestra arriba. En su lugar, usamos el siguiente símbolo.

En su uso, escriba los números enteros (números naturales) dentro del símbolo. Además, escriba un número primo a la izquierda del símbolo. Se parece a esto.

En términos de uso, es igual que el diagrama de flechas anterior. Descomponemos un número entero dividiéndolo por un número primo. Por ejemplo, una factorización prima de 300 se vería así.

Si los números primos aparecen al final, la factorización prima está terminada. Luego, al recopilar todos los números primos, podemos hacer una ecuación de multiplicación. El significado es el mismo que el del diagrama de flechas. La diferencia es que al usar este símbolo, podemos hacer la factorización prima de manera más eficiente.

La respuesta a la factorización prima es la misma en cualquier orden

Por cierto, la factorización prima se puede calcular en cualquier orden. Porque la respuesta final será la misma. Por ejemplo, la factorización prima de 300 dará la misma respuesta incluso si el orden de división es diferente, como se muestra a continuación.

Hemos explicado anteriormente que, en la factorización prima, debemos dividir los números primos en el orden de sus números más pequeños. Esto se debe a que cuanto más pequeño es el número primo, como 2 o 3, más fácil es dividirlo y se cometen menos errores. Sin embargo, en algunos casos, puede ser mejor dividir por un número primo más grande para evitar errores de cálculo.

Si el entero que queremos dividir es un número par, siempre podemos dividirlo por 2. Por otro lado, si es un número impar, a veces no está claro si podemos dividirlo por un número primo más pequeño.

Por ejemplo, ¿por qué número primo se puede dividir 105? 105 se puede dividir entre 3. Sin embargo, es difícil notar que es divisible por 3. Por otro lado, es fácil notar que 105 es divisible por 5.

El conocimiento de que podemos hacer la factorización prima en cualquier orden puede evitar errores de cálculo en matemáticas. Al usar la factorización prima, podemos devolver un número entero a una ecuación de multiplicación. En este caso, no se preocupe por el orden en el que divide entre los números primos.

Saque el número cuadrado dentro del símbolo radical

¿Por qué necesitamos aprender a factorizar en factores primos? Es porque usamos mucho la factorización prima en el cálculo de la raíz cuadrada.

En el cálculo de la raíz cuadrada, existe la regla de que el número en el símbolo de la raíz debe ser lo más pequeño posible. Para hacerlo, tenemos que hacer una factorización prima. Específicamente, tenemos que sacar los números al cuadrado en el símbolo de la raíz.

Como se mencionó anteriormente, si hay cuadrados en el símbolo radical, podemos poner los números fuera del signo de la raíz.

Al usar esta fórmula, podemos poner los números afuera en el signo de la raíz después de hacer la factorización prima. Por ejemplo, ya hemos calculado que la factorización prima de 300 produce lo siguiente

Entonces, ¿cómo se puede calcular $ sqrt <300> $? Considere $ sqrt <300> $ de la siguiente manera para obtener el número del signo radical.

La razón para aprender la factorización prima es que se usa en los cálculos de raíz cuadrada. Cuando quitas los números del símbolo de la raíz, todo el mundo hace la factorización prima.

Entonces, ¿por qué tenemos que eliminar los números del símbolo radical? La razón es simple: es más fácil entender los números. Por ejemplo, el número $ sqrt <300> $ es difícil de responder instantáneamente. Por otro lado, $ 10 sqrt <3> $ es fácil.

$ sqrt <3> ≒ 1.73 $. Dado que es 10 veces más, sabemos que $ 10 sqrt <3> $ es aproximadamente 17.3. Las matemáticas son el estudio de la comprensión del significado de los números. Tenemos que hacer que los números sean fáciles de entender, por lo que tenemos que sacar los números del símbolo raíz.

No divida otros números que no sean primos

Tenga en cuenta que en la factorización prima, no debemos usar números no primos para la división. Si mezclamos números no primos, no podemos eliminar los números del signo radical. Por ejemplo, cuando hacemos la factorización prima de 300, ¿qué sucede si lo dividimos entre 4?

4 no es un número primo porque se puede dividir entre 2. Sin embargo, si dividimos entre 4, muchas personas hacen la siguiente ecuación.

Como resultado, terminamos con una respuesta de $ 5 sqrt <12> $. Esta respuesta es incorrecta, porque podemos hacer que el número en el símbolo de la ruta sea aún más pequeño.

Para un número no primo, como 4, podemos dividirlo por otro número. Como resultado, podemos & # 8217t cambiar a una ecuación de multiplicación usando el número más pequeño. Por lo tanto, los números en el signo de la raíz se vuelven más grandes y provocan un error de cálculo. En la factorización prima, asegúrese de dividir por números primos.


2.8: Multiplicar y dividir enteros (Parte 2)

Dadas dos cadenas binarias que representan el valor de dos enteros, encuentre el producto de dos cadenas. Por ejemplo, si la primera cadena de bits es & # 82201100 & # 8221 y la segunda cadena de bits es & # 82201010 & # 8221, la salida debe ser 120.

Para simplificar, deje que la longitud de dos cadenas sea la misma y n.

A Enfoque ingenuo es seguir el proceso que estudiamos en la escuela. Uno por uno, tome todos los bits del segundo número y multiplíquelos por todos los bits del primer número. Finalmente sume todas las multiplicaciones. Este algoritmo toma O (n ^ 2) tiempo.

Utilizando Divide y conquistaras, podemos multiplicar dos enteros en menos complejidad de tiempo. Dividimos los números dados en dos mitades. Deje que los números dados sean X e Y.

Para simplificar, supongamos que n es par

El producto XY se puede escribir de la siguiente manera.

Si echamos un vistazo a la fórmula anterior, hay cuatro multiplicaciones de tamaño n / 2, por lo que básicamente dividimos el problema de tamaño n en cuatro subproblemas de tamaño n / 2. Pero eso no ayuda porque la solución de recurrencia T (n) = 4T (n / 2) + O (n) es O (n ^ 2). La parte complicada de este algoritmo es cambiar los dos términos del medio a alguna otra forma para que solo una multiplicación adicional sea suficiente. La siguiente es una expresión complicada para los dos términos intermedios.

Entonces el valor final de XY se convierte en

Con el truco anterior, la recurrencia se convierte en T (n) = 3T (n / 2) + O (n) y la solución de esta recurrencia es O (n 1.59).

¿Qué pasa si las longitudes de las cadenas de entrada son diferentes y no son uniformes? Para manejar el caso de diferente longitud, agregamos 0 & # 8217s al principio. Para manejar longitudes impares, ponemos piso (n / 2) bits en la mitad izquierda y techo (n / 2) bits en la mitad derecha. Entonces, la expresión para XY cambia a siguiente.

El algoritmo anterior se llama algoritmo de Karatsuba y se puede utilizar para cualquier base.


Benchmarks

Dado que se muestran muchos métodos diferentes en las respuestas y ninguna de las respuestas realmente demuestra ninguna ventaja en términos de rendimiento, traté de compararlos yo mismo. Mi plan era escribir una respuesta que contenga un corto tabla y una respuesta definitiva qué método es el más rápido.

Desafortunadamente, no fue tan simple. (Nunca lo es). Parece que el rendimiento de las fórmulas de redondeo depende del tipo de datos utilizado, compilador y nivel de optimización.

En un caso, hay un aumento de la velocidad en 7.5 × de un método a otro. Entonces, el impacto puede ser significativo para algunas personas.

Para enteros largos, la versión ingenua que usa un tipo de conversión para flotar y std :: ceil fue en realidad la más rápida. Esto fue interesante para mí personalmente, ya que tenía la intención de usarlo con size_t, que es por lo general definido como unsigned long.

Para int s ordinarios, depende de su nivel de optimización. Para niveles más bajos, la solución de @ Jwodder funciona mejor. Para los niveles más altos, std :: ceil fue el óptimo. Con una excepción: para la combinación clang / unsigned int, @ Jwodder's fue aún mejor.

Las soluciones de la respuesta aceptada nunca superaron realmente a las otras dos. Sin embargo, debe tener en cuenta que la solución de @ Jwodder no funciona con negativos.

Los resultados están en la parte inferior.


9. Más allá de la suma y resta de números enteros.


En el capítulo anterior, discutimos los detalles de cómo las computadoras hacen sumas y restas binarias. Con esos antecedentes, ahora estamos listos para explorar operaciones aritméticas más complejas. La multiplicación y división de enteros son lo suficientemente primitivas como para que muchas computadoras las implementen en hardware, pero lo suficientemente complejas como para que en muchas otras computadoras muy exitosas se realicen completamente mediante software. Esto introduce un tema importante, las compensaciones de ingeniería que conducen a las decisiones sobre qué características implementar directamente en el hardware y cuáles se realizan de manera más económica en el software.

Multiplicación

Antes de discutir las implementaciones de máquinas eficientes de multiplicación y división, ya sea en hardware o software, debemos retroceder y discutir, primero, los algoritmos de lápiz y papel en decimal, y luego cómo podemos hacerlos en binario. Considere el problema de multiplicar 128 por 512 en decimal. Así es como probablemente le enseñaron a resolver este problema con lápiz y papel:

Un problema de multiplicación
1 2 8 multiplicando
&veces 5 1 2 multiplicador
2 5 6 producto parcial 2 y tiempos 128
1 2 8 producto parcial 1 y tiempos 128
+ 6 4 0 producto parcial 5 y tiempos 128
6 5 5 3 6 producto


La hoja de trabajo para realizar un problema decimal como se muestra arriba es en realidad un rastro de la ejecución de un algoritmo. Este algoritmo procede multiplicando primero el multiplicando por cada dígito del multiplicador para crear una lista de productos parciales. Cada producto parcial se escribe desplazado en un lugar en relación con su predecesor, de modo que su dígito menos significativo esté debajo del dígito correspondiente del multiplicador. Este desplazamiento equivale a multiplicar el multiplicando por diez antes de calcular cada producto parcial. Finalmente, el algoritmo termina sumando los productos parciales para calcular el producto.

La declaración de este algoritmo no depende de la base numérica que se utilice. Por lo tanto, podemos usar este mismo algoritmo exacto en base 16 o en base 8 o incluso en base 2. La parte difícil de este algoritmo en decimal es multiplicar el multiplicando por los dígitos del multiplicador. Para hacer esto, el típico estudiante de escuela primaria debe memorizar las tablas de multiplicar de base 10. La tabla de multiplicar de base 2 es mucho más simple.

Ejercicios

a) Escribe código, en C, C ++ o Java, para multiplicar dos enteros positivos usando el algoritmo decimal que usarías con lápiz y papel. Con cada iteración, deberías terminar acumulando un producto parcial, multiplicando el multiplicando por 10 y dividiendo el multiplicador por 10. Puedes extraer el dígito menos significativo del multiplicador usando el operador mod, escrito como% en estos idiomas. Multiplica esto por el multiplicando para calcular el producto parcial. Puede parecer una tontería usar tanto la multiplicación como la división para multiplicar, pero el único divisor usado es 10, y los únicos multiplicadores son de 0 a 10, por lo que este código usa un conjunto limitado de operaciones para implementar una operación mucho más general.

Algoritmos de multiplicación binaria

Para multiplicar dos números binarios usando lápiz y papel, usamos exactamente el mismo algoritmo de multiplicación que usaríamos en decimal, pero lo hacemos usando aritmética binaria. Considere, por ejemplo, el problema de multiplicar 100 10 por 10 10. En binario, esto es 1100100 2 por 1010 2 si trabajamos el problema con lápiz y papel, obtenemos esto:

Un problema de multiplicación binaria
1 1 0 0 1 0 0 = 100 multiplicando
&veces 1 0 1 0 = 10 multiplicador
0 0 0 0 0 0 0 = 0 y por 100 productos parciales
1 1 0 0 1 0 0 = 1 y multiplicado por 100
0 0 0 0 0 0 0 = 0 y por 100
+ 1 1 0 0 1 0 0 = 1 y multiplicado por 100
1 1 1 1 1 0 1 0 0 0 = 10 y multiplicado por 100 = 1000

Esta hoja de trabajo para el algoritmo binario muestra los productos parciales calculados al multiplicar el multiplicando por cada dígito del multiplicador. Cada producto parcial se escribe desplazado de modo que su dígito menos significativo esté debajo del dígito correspondiente del multiplicador, y luego se suman los productos parciales para calcular el producto.

No es difícil reducir este algoritmo de papel y lápiz a código de máquina para la máquina Hawk. El primer paso en tal reducción es resolverlo en un lenguaje de alto nivel como C o Java:

Un algoritmo de multiplicación binaria en C

En lo anterior, hemos desplazado el multiplicando un lugar restante en cada iteración para que podamos sumarlo como un producto parcial cuando el bit multiplicador correspondiente es distinto de cero. Para cada iteración, cambiamos el multiplicador un lugar a la derecha para que siempre podamos verificar el bit menos significativo en lugar de probar un bit diferente para cada iteración. Probamos el bit usando el operador bit a bit y de C para enmascarar todos menos el bit menos significativo. Aquí está exactamente el mismo código usando operadores que muchos son más familiares:

Un algoritmo de multiplicación binaria en C usando operadores familiares

Aquí, sustituimos la multiplicación y la división por dos por desplazamiento, y probamos para ver si el multiplicador era par o impar comprobando el resto después de la división por dos. El uso de la multiplicación y la división para implementar la multiplicación no es útil en una máquina sin hardware de multiplicación, pero los buenos compiladores frecuentemente sustituyen la manipulación por desplazamiento y bit por multiplicación y división por potencias de dos.

Este algoritmo es antiguo y ha sido redescubierto repetidamente. A veces se le llama el algoritmo campesino ruso o multiplicaton egipcio después de dos de los muchos orígenes populares del método.

El primer código de multiplicación proporcionado anteriormente solo utiliza operadores disponibles en la máquina Hawk. Para los cambios de izquierda y derecha, donde C usa & lt & lt y & gt & gt, tenemos SL y SRU, y para el operador and, donde C usa & amp, tenemos AND. Estos nos permiten reescribir el código C de la siguiente manera:

Multiplicación binaria en el halcón

El código anterior toma 8 o 9 instrucciones por iteración del ciclo, dependiendo de si el bit del multiplicador es uno o cero. El código está escrito en lo que podría llamarse un estilo de cabeza de hueso, haciendo el menor uso posible de información auxiliar. De hecho, un pequeño estudio de las instrucciones de turno conduce rápidamente a algunas optimizaciones significativas.

Como regla general, la optimización es algo que se deja para el final, pero los primeros candidatos para la optimización son aquellas rutinas que se llaman repetidamente desde muchas aplicaciones diferentes. Las subrutinas para realizar operaciones aritméticas que no se realizan en hardware son excelentes candidatas para esto. Claramente, la velocidad de la rutina de multiplicación podría tener un efecto central en una amplia variedad de aplicaciones. Por tanto, exploraremos la posibilidad de optimizar esta rutina con más interés del que hubiéramos considerado optimizar de otras rutinas menos utilizadas.

Todas las instrucciones de turno en el Hawk establecen los códigos de condición, por lo que después de realizar la instrucción SRU al final del ciclo, podemos probar para ver si el multiplicando se ha reducido a cero, eliminando la necesidad de la instrucción TESTR en la parte superior de la bucle en todas menos la primera iteración. Podemos probar incluso más que esto, porque los operadores de desplazamiento también establecen el bit de acarreo en los códigos de condición para informar sobre los bits desplazados fuera del operando, por lo que la instrucción SRU, con un recuento de desplazamiento de uno, también nos dice si el operando fue par o impar antes del turno. Esto nos lleva al siguiente código de multiplicación sin signo más rápido:

Multiplicación binaria más rápida en el Hawk

Esta versión mejorada toma 5 o 6 instrucciones por iteración, por lo que se ejecutará aproximadamente un 30% más rápido que el código original. Además, utiliza un registro menos debido a la forma en que se prueban los bits multiplicadores. Un costo de esta optimización es que es más difícil escribir comentarios tipo C porque los lenguajes C ya no capturan con precisión lo que hace parte del código anterior. Este código es tan bueno como se esperaría normalmente de un código en lenguaje ensamblador decente, pero es posible realizar más optimizaciones. Considera lo siguiente:

Multiplicación binaria aún más rápida para Hawk

Esta nueva versión toma 4 o 6 instrucciones por iteración, solo un poco más rápido por iteración que el código anterior. Además, la duplicación de la instrucción de devolución ahorró algunas instrucciones por llamada. Si estos cambios conducen realmente a una mejora del rendimiento en una CPU real, debe determinarse mediante pruebas empíricas. Tomados en conjunto, estos cambios destruyen la estructura de control limpia del original, impidiendo el uso de un estilo de comentario de lenguaje de alto nivel. Las optimizaciones que producen un código casi ilegible solo se justifican en el código de rendimiento crítico.

Esta optimización particular está trabajando hacia un callejón sin salida. Así como la clave para las operaciones rápidas de cadena en el Hawk es trabajar con bloques de caracteres, la clave para la multiplicación rápida es operar en una base numérica mayor que 2. Para el Hawk, la base 16 funciona bien. El capítulo 13 del manual de Hawk proporciona un código de multiplicación de enteros sin signo que tiene un costo en el peor de los casos de 2.8 instrucciones por bit para calcular un producto de 32 bits, este código es incluso menos legible que cualquiera de los códigos anteriores, pero si la velocidad es el objeto, es un claro ganador.

Ejercicios

b) Lanza monedas para generar un multiplicando aleatorio de 8 bits y un multiplicador aleatorio de 4 bits. Multiplíquelos usando el algoritmo de multiplicación binaria de lápiz y papel, luego verifique su trabajo convirtiendo el multiplicador, el multiplicando y el producto a decimal para su verificación.

c) Vuelva a escribir el algoritmo de multiplicación binaria en C para que funcione en base 16. Esto implica solo cambios extremadamente pequeños en el código dado anteriormente: debe permitir que los dígitos del multiplicador tengan más de 2 valores posibles (cero y uno) y debe cambiar todos referencias a la base de 2 a 16 (o alternativamente, cambie todos los cambios de un bit a cambios de 4 bits).

d) ¿Qué sucede con el código de multiplicación binaria Hawk si multiplica números que generan un resultado de 2 32 o más? Por ejemplo, ¿qué sucede si calcula 125 000 al cuadrado con este código? 125,000 está cerca de 2 17, por lo que la respuesta debería estar cerca de 2 34.

Multiplicación binaria en hardware

En el código de multiplicación binario dado anteriormente, la multiplicación de dos números de 32 bits tomó 32 turnos y hasta 32 adiciones. Podemos hacer todo esto en paralelo usando 31 sumadores. Así es como funciona el esquema paralelo para dos números ayb de 3 bits para obtener el producto p de 6 bits.

Hardware de multiplicación para multiplicadores de 3 bits

Este circuito no está optimizado. La fila superior de sumadores se puede eliminar y el sumador de la derecha en cada fila se puede reemplazar con un medio sumador. El número total de puertas lógicas necesarias se calcula de la siguiente manera:

Contabilización del costo de un multiplicador rápido
Un solo sumador completo 12
32 bits por palabra & veces 32
puertas por sumador de 32 bits 384
31 sumadores para agregar 32 productos parciales & veces 31
Subtotal: costo de agregar productos parciales 11904
y puertas para calcular un producto parcial 32
32 productos parciales & veces 32
Subtotal: costo de calcular productos parciales 1024
Recuento de puertas estimado para una multiplicación rápida 12928

Esto es bastante desalentador. 12000 puertas es más que suficiente para construir una CPU completa. Por el contrario, se necesitan menos de 2000 puertas para implementar toda la unidad lógica aritmética de Hawk y el cambiador, y esto es fundamental para la mayoría de los cálculos. Agregar una función adicional mediante el uso de siete veces la cantidad de hardware no parece ser un enfoque muy económico para el diseño de computadoras. Por lo tanto, pocas computadoras, pero las de mayor rendimiento, incluyen multiplicadores de alta velocidad que operan de esta manera de fuerza bruta.

La mayoría de las computadoras que tienen hardware de multiplicación hacen la multiplicación usando la misma unidad aritmético-lógica que usan para la suma, ciclando los datos a través de la unidad aritmético-lógica tantas veces como sea necesario para calcular el producto. Esta es la razón por la que, cuando observa los datos para determinar la velocidad de las diversas instrucciones en computadoras reales, es bastante común encontrar que la multiplicación de números enteros es 10 o más veces más lenta que la suma de números enteros. En el Intel Pentium, introducido en 1993, el hardware podía ejecutar dos instrucciones de suma de enteros en paralelo en una décima parte del tiempo que se tardaba en ejecutar una instrucción de multiplicación de enteros.

Multiplicación rápida por constantes

Debido a la lentitud de la multiplicación del hardware en la mayoría de las computadoras, desde hace mucho tiempo se insta a los escritores de compiladores a evitar el uso de instrucciones de multiplicación siempre que puedan encontrar una secuencia corta de desplazamiento y agregar instrucciones que hagan lo mismo. Estas optimizaciones se pueden expresar con bastante facilidad en lenguajes como C, C ++ o Java:

Optimizaciones para evitar multiplicaciones
original sustitución
a * 2 a & lt & lt 1
a * 3 (a & lt & lt 1) + a
a * 4 a & lt & lt 2
a * 5 (a & lt & lt 2) + a
a * 6 ((a & lt & lt 1) + a) & lt & lt 1
a * 7 (a & lt & lt 3) - a
a * 8 a & lt & lt 3
a * 9 (a & lt & lt 3) + a
a * 10 ((a & lt & lt 2) + a) & lt & lt 1

No escriba este tipo de código en sus programas C o Java a menos que su objetivo sea escribir código que nadie pueda entender. Deje que el compilador haga la optimización por usted. Por otro lado, si está escribiendo en lenguaje ensamblador o escribiendo un compilador, necesita conocer estas optimizaciones. Además, si está intentando escribir código rápido, es útil comprender lo que un buen compilador le hará a su código.

En general, habrá un producto parcial para sumar para cada uno en la representación binaria del multiplicador, más los operadores de turno necesarios para alinear los productos parciales. En el Pentium, donde una multiplicación de enteros tomó aproximadamente diez veces más que un simple shift o add, los buenos compiladores usualmente usan una combinación de instrucciones shift y add siempre que un multiplicador constante tiene cinco o menos un bit.

A veces, sin embargo, podemos hacerlo incluso mejor, como se ilustra en el caso de la multiplicación por siete en la tabla anterior. En ese caso, podríamos haber usado (((a & lt & lt1) + a) & lt & lt1) + a, sumando tres términos que corresponden a los 3 bits uno en el multiplicador. En cambio, en la tabla anterior, multiplicamos por ocho y luego restamos.

Otro truco que podemos utilizar es factorizar un número y luego multiplicar por cada uno de los factores en sucesión. Por ejemplo, para multiplicar por 100, podríamos multiplicar por 10 dos veces seguidas, o podríamos multiplicar por 5 dos veces seguidas y luego multiplicar el resultado por 4.

Optimizaciones alternativas para la multiplicación por 100
a * 100 (((a & lt & lt 1) + a) & lt & lt 3) + a) & lt & lt 2
a * 10 * 10 t = ((a & lt & lt 2) + a) & lt & lt 1
((t & lt & lt 2) + t) & lt & lt 1
a * 5 * 5 * 4 t = ((a & lt & lt 2) + a)
((t & lt & lt 2) + t) & lt & lt 2

¿Cuál de estos será más rápido en una máquina en particular? En general, examinar el código de lenguaje de alto nivel solo permite una suposición fundamentada. Las arquitecturas de computadora clásicas usan aproximadamente una instrucción por operador, y cuando las operaciones de registro para registrar están disponibles, la asignación a las variables temporales utilizadas para los resultados intermedios puede ser gratuita. Para tales máquinas, lo que importa es el recuento total de operadores en la expresión. Esto nos lleva a adivinar que la multiplicación binaria por 100 empatará con multiplicar por 5 dos veces y luego por 4, tomando 3 turnos y 2 sumas, mientras que multiplicar por 10 dos veces seguidas será más lento, tomando 4 turnos y 2 sumas.

Lo primero que podemos concluir de las estimaciones de rendimiento anteriores es que todos los métodos anteriores de multiplicación por 100 serán notablemente más rápidos que una multiplicación por hardware en una máquina como el Pentium. Los números sugieren que la multiplicación por diez dos veces en secuencia podría ser un poco más lenta, pero con una diferencia de solo una operación entre nuestras estimaciones más rápidas y más lentas, lo que realmente deberíamos concluir es que estos enfoques diferentes son todos similares.

Para reducirlos al código de máquina, debemos mirar el repertorio de instrucciones de turno disponibles. El Hawk tiene dos instrucciones de desplazamiento a la izquierda, MOVSL, que hace un registro para registrar el movimiento más un desplazamiento, y ADDSL, que desplaza el contenido de un registro y luego le agrega otro registro. El código de operación del lenguaje ensamblador de SL es realmente ADDSL con el segundo registro establecido en cero, lo que indica que no se debe agregar nada. Se incluyen instrucciones similares de cambio y adición en varias arquitecturas diseñadas después de finales de la década de 1970 y principios de la de 1980, un grupo de Hewlett Packard fue el primero en describir, en detalle, cómo explotar completamente estas instrucciones. Así es como podemos usarlos en el Hawk:

Multiplicación por constantes en el halcón
SL R3,1 R3 = R3 * 2 = R3 & lt & lt 1
ADDSL R3, R3,1 R3 = R3 * 3 = (R3 & lt & lt 1) + R3
SL R3,2 R3 = R3 * 4 = R3 & lt & lt 2
ADDSL R3, R3,2 R3 = R3 * 5 = (R3 & lt & lt 2) + R3
SL
ADDSL
R3,1
R3, R3,1
R3 = R3 * 6 = R3 * 2 * 3
NEG
ADDSL
R1, R3
R3, R1,3
R3 = R3 * 7 = (R3 & lt & lt 3) - R3
SL R3,3 R3 = R3 * 8 = R3 & lt & lt 3
ADDSL R3, R3,2 R3 = R3 * 9 = (R3 & lt & lt 3) + R3
SL
ADDSL
R3,1
R3, R3,2
R3 = R3 * 10 = R3 * 2 * 5


La instrucción Hawk ADDSL nos permite multiplicar por una amplia gama de pequeñas constantes en solo una o dos instrucciones. La multiplicación por 11 requiere tres instrucciones, pero también hay tres secuencias de instrucciones para multiplicar por todos los números enteros más grandes hasta 38 y muchos más. Muchos de estos están documentados en el Capítulo 10 del manual de la CPU Hawk.

Ejercicios

e) Convierta cada uno de los tres algoritmos dados anteriormente para la multiplicación por 100 en secuencias de instrucciones Hawk codificadas de forma estricta que calculan R3 = R3 * 100. Clasifíquelos en orden de velocidad. (Tenga en cuenta que podría haber un empate y suponga que puede usar R1 como registro auxiliar).

f) Escriba código halcón para multiplicar R3 por 55.

g) Escribe código halcón para multiplicar R3 por 60.

h) Escribe código halcón para multiplicar R3 por 47.

i) ¿Cuál es el multiplicador constante más pequeño para Hawk que requiere una secuencia de 4 instrucciones? (Todas las secuencias dadas en el manual de Hawk tienen solo 3 instrucciones).

Por qué no hay instrucciones de multiplicar en el halcón

Ahora hemos cubierto suficiente terreno para comprender por qué Hawk y algunas otras arquitecturas de computadora modernas de alto rendimiento de 32 bits no tienen soporte de hardware para la multiplicación de enteros. La respuesta está en la frecuencia con la que los programas de aplicación realmente necesitan multiplicarse. Los estudios a gran escala de programas reales muestran que la gran mayoría de las operaciones de multiplicación en la mayor parte del código real implican la multiplicación por pequeñas constantes. la multiplicación de una variable por una variable es mucho más rara.

Debido a que tenemos secuencias muy cortas de instrucciones para multiplicar por las constantes pequeñas más comunes, y debido a que tenemos subrutinas relativamente rápidas para las raras ocasiones en las que es necesario multiplicar dos variables, la implementación de la multiplicación en hardware tiene pocas ventajas.

Supongamos que el hardware fuera tan económico que fácilmente pudiéramos permitirnos dedicar miles de puertas a una unidad de multiplicación de hardware rápida. Una pregunta de ingeniería importante es, ¿cuáles son los usos competitivos que podríamos hacer de esas puertas lógicas? La multiplicación rápida de hardware puede acelerar un cálculo en un pequeño porcentaje. ¿Podemos usar esas puertas para un mejor efecto en otro lugar de la CPU? Quizás podamos usar esas puertas para construir una segunda CPU, potencialmente duplicando la velocidad de la computadora, o usar esas puertas para construir más registros o para construir memoria caché que acelera todas las referencias de memoria.

División

Para dividir un número por otro usando lápiz y papel, usamos el algoritmo clásico de división larga que se enseña tradicionalmente en la escuela primaria. Al igual que con la multiplicación de lápiz y papel, este algoritmo de división implica construir y completar una hoja de trabajo a medida que avanza el cálculo. Considere el problema de dividir 128 en 65538:

Un problema de división
5 1 2 cociente
divisor 1 2 8 ) 6 5 5 3 8 dividendo
& ndash 6 4 0 = 5 y tiempos 128
1 5 3 8
& ndash 1 2 8 = 1 y veces 128 productos parciales
2 5 8
& ndash 2 5 6 = 2 y tiempos 128
2 recordatorio

La división larga implica una serie de restas del dividendo. Los valores restados se llaman productos parciales porque son los productos parciales que sumaríamos al multiplicar el cociente por el divisor para obtener el dividendo (menos el resto). Puede verificar esto comparando con el problema de multiplicación presentado anteriormente en este capítulo. Cada producto parcial es el producto de un dígito del cociente por el divisor. La parte difícil con la división larga decimal fue aprender a estimar los dígitos del cociente. Si hacemos esto en binario, esa parte se vuelve mucho más fácil porque solo hay dos opciones para cada dígito.

División binaria

La forma clásica de dividir un número binario por otro es desplazar tanto el cociente como el dividendo a la izquierda en cada paso en lugar de mantenerlos estáticamente y desplazar los productos parciales a la derecha. Comenzamos con el dividendo de 32 bits en los 32 bits menos significativos de un registro de 64 bits, luego, después de 32 pasos de desplazamiento y resta, el resto está en los 32 bits altos y el cociente en los 32 bits bajos. Podemos escribir esto en C en una máquina que admita el tipo int usando 32 bits y long int usando 64 bits:

Un algoritmo de división binaria en C

Este breve pero difícil fragmento de código calcula tanto el resto como el cociente, sin importar cuál se necesite. La versión C no puede devolver ambos, pero devolver ambos es fácil en lenguaje ensamblador.

Para escribir código Hawk equivalente, necesitamos una forma de desplazar un lugar número uno de 64 bits a la izquierda. Almacenaremos la cantidad de 64 bits en dos registros y luego usaremos aspectos secundarios de las instrucciones de cambio para ayudar: En el Hawk (y en la mayoría de las otras máquinas), los cambios usan el bit de acarreo para informar sobre los bits desplazados fuera del resultado. Después de un desplazamiento de un bit a la izquierda, el acarreo contiene el bit de signo antiguo. Por lo tanto, para un desplazamiento largo a la izquierda, necesitamos agregar el bit de acarreo en el bit bajo de la mitad alta del resultado. Hay muchas formas de hacer esto en el Hawk:

Desplazamientos a la izquierda de 64 bits en el Hawk


La primera versión anterior usa una rama condicional para probar el acarreo después de cambiar la mitad baja del número, y luego agrega explícitamente una a la mitad alta si es necesario. El Hawk tiene una instrucción especial para agregar el acarreo a la suma de dos registros, ADDC. La segunda versión usa esto para reemplazar la rama condicional y el incremento. Tenga en cuenta que agregar un número a sí mismo lo desplaza un lugar, por lo que ADDC puede cambiar a medida que agrega en el acarreo. Esto da la versión final y más rápida. Para completar, aquí hay un rápido desplazamiento a la derecha de 64 bits usando una instrucción especial llamada ADJUST:

Un desplazamiento a la derecha de 64 bits en el Hawk

Estos cambios de alta precisión nos brindan las herramientas que necesitamos codificar un algoritmo de división en el Hawk:

División binaria en el halcón


Aquí, nos hemos referido a la mitad alta de nuestro registro de trabajo de 64 bits como el resto y a la mitad baja como el cociente, porque eso es lo que eventualmente contienen. A medida que el código se repite, los bits del dividendo se desplazan del registro del cociente al resto antes de restar cada producto parcial.

Hicimos un cambio en la organización del ciclo cuando pasamos del código C original al código dado arriba. En lugar de hacer que el ciclo cuente de 0 a 32, comenzamos la variable de control del ciclo en 32 y la reducimos a cero. Esta optimización nos permitió probar la terminación al verificar los códigos de condición después del decremento, eliminando la necesidad de una instrucción de comparación en el cuerpo del bucle.

Hay una optimización adicional que se puede realizar en cualquier bucle, denominada desenrollado de bucle. En el caso general, el desenrollado de un bucle implica replicar el cuerpo de un bucle, incluidas las pruebas de terminación del bucle. Esto agranda el cuerpo del bucle y elimina la instrucción de bifurcación por réplica. Al desenrollar un ciclo definido, donde el número de repeticiones del cuerpo del ciclo se divide uniformemente en el número de iteraciones, podemos ahorrar aún más omitiendo las pruebas duplicadas para la terminación del ciclo.

En general, el desenrollado de bucles tiene su mayor impacto en los bucles con un cuerpo muy pequeño, y el algoritmo de división que se proporciona aquí es un buen ejemplo. Aquí está el resultado, aplicado al código C anterior:

División binaria con bucle que se desenrolla en C

Desenrollar el ciclo en un paso reduce el número de iteraciones a 16, elimina la mitad de las instrucciones utilizadas para incrementar y probar el contador del ciclo y la mitad de las instrucciones de bifurcación de regreso a la parte superior del ciclo. Al desenrollar los 4 pasos del bucle, se reduce el número de iteraciones a 8 y se reduce a la mitad la sobrecarga una vez más. Desenrollar el bucle un total de 32 veces eliminaría por completo la variable de control del bucle y las instrucciones de bifurcación relacionadas a costa de la duplicación a gran escala del cuerpo del bucle.

Ejercicios

j) Escriba el código Hawk para un desplazamiento a la izquierda de 96 bits y para un desplazamiento a la derecha de 96 bits, almacenando el operando en los registros 3, 4 y 5, primero los 32 bits menos significativos.

k) Escriba una nueva versión del código de división Hawk que se proporciona aquí con el cuerpo del bucle desenrollado un paso como en el código C dado anteriormente.

Multiplicar y dividir firmado

La forma más obvia de manejar la multiplicación y división con signo es recordar los signos de todos los operandos y luego tomar sus valores absolutos de antemano. Después de calcular el producto de los valores absolutos, el resultado debe negarse si los operandos tienen signos opuestos. Esto se ilustra aquí para la multiplicación, pero es igualmente sencillo para la división.

Un enfoque ingenuo para la multiplicación con signos en C

El único problema con este enfoque es que es innecesariamente complicado. Siempre que usemos números en complemento a dos, podemos aprovechar la interpretación simple del valor posicional de los dígitos binarios de un número en complemento a dos. Para los bits 0 a 30 de un número de complemento a dos de 32 bits, el peso del bit i es 2 i, idéntico al peso de un número binario simple. Para el bit más significativo, el bit de signo, se niega el peso, por lo que el peso del bit de signo es & ndash2 31. Esto lleva al hecho notable de que, al multiplicar enteros con signo en complemento a dos, se debe restar el producto parcial final para obtener el resultado con signo correcto.

Para usar este hecho, recodificamos nuestro algoritmo de multiplicación para usar un bucle definido en lugar de un bucle indefinido, haciendo 31 pasos de multiplicación dentro del bucle y luego manejando el producto parcial calculado a partir del bit de signo fuera del bucle, restando donde todos los demás productos parciales fueron agregados. Aquí hay un ejemplo de multiplicación con signo, codificado usando desplazamientos a la izquierda tanto para el multiplicador como para el producto:

Multiplicación rápida con signos en el halcón

El código anterior es agradablemente compacto, pero puede acelerarse con todos los métodos que ya hemos discutido. Por ejemplo, el bucle puede desenrollarse parcialmente para reducir el número de iteraciones o desenrollarse completamente para eliminar el contador de bucles. Considere, por ejemplo, usar un desenrollado de 3 vías, donde el bucle iteraría 10 veces con 3 pasos de multiplicación en el cuerpo del bucle, y luego un paso de multiplicación más fuera del cuerpo del bucle antes del paso final que resta el multiplicando si el multiplicando es negativo.

Ejercicios

l) Escriba el código Hawk para una rutina de multiplicación con signo ingenuo que llame a la rutina de multiplicación sin firmar que se proporcionó anteriormente.

m) Escriba código C, C ++ o Java para una rutina de división con signo ingenuo que llame a algo similar a la rutina de división sin signo que se proporcionó anteriormente.

n) Modifique el código para la rutina de multiplicación con signo que se proporciona aquí para que calcule el producto de 64 bits en los registros 3 y 4. Tenga en cuenta que esto es casi un trabajo fácil: todo lo que necesita hacer es reemplazar los dos cambios independientes de los registros 3 y 4 con un solo desplazamiento de 64 bits.

o) Modifique el código para la rutina de multiplicación firmada que se proporciona aquí para usar 15 iteraciones donde cada iteración incluye un desenrollado del ciclo.

p) Modifique el código de multiplicación con signo que se proporciona aquí para realizar una multiplicación sin signo, y luego compárelo con el código de multiplicación sin signo que se proporcionó anteriormente. ¿Cuál sería más rápido y por qué?

Aritmética de mayor precisión

Como ya se señaló, la arquitectura Hawk incluye soporte para turnos largos compuestos por varios turnos más cortos de 32 bits. Las mismas instrucciones de apoyo especiales que permiten esto también son útiles para sumas y restas de alta precisión. Por lo tanto, si algún problema requiere el uso de números de 128 bits, por ejemplo, usando los registros 4 a 7 para contener un número y los registros 8 a 11 para contener otro, podemos sumar o restar estos dos números de la siguiente manera:

Sumas y restas de 128 bits en el Hawk


Hay dos formas de crear una rutina de multiplicación de alta precisión. Una es simplemente tomar una rutina de multiplicación binaria simple y expandirla, usando turnos de múltiples registros y adiciones de múltiples registros. La otra es construir una rutina de alta precisión a partir de múltiples aplicaciones de una rutina de baja precisión. Dada una multiplicación sin signo de 32 bits, donde ab y cd son cantidades de 64 bits, siendo ayc la mitad más significativa de cada una y byd la mitad menos significativa, el producto ab & times cd es a & times c & times2 64 + a & tiempos d & tiempos2 32 + b & tiempos c & tiempos2 32 + b & tiempos d.

Tenga en cuenta que los cambios en múltiplos de 32 bits, equivalentes a la multiplicación por potencias de 2 32, se realizan de forma trivial moviéndose (o sumando) al registro apropiado de número superior en la matriz de registros que contienen cada resultado de precisión múltiple. Como resultado, cada producto aquí se puede calcular usando multiplicaciones de 32 bits que producen productos de 64 bits, por lo que solo la suma final requiere largas instrucciones de adición. Este algoritmo de multiplicación de precisión extendida fue documentado a fondo por Charles Babbage en el siglo XIX, aunque lo hizo en decimal.

Ejercicios

q) Escriba el código Hawk para un desplazamiento a la derecha de 128 bits.

r) Escriba el código Hawk para un desplazamiento a la izquierda de 128 bits.

s) Escriba el código Hawk para una multiplicación de enteros sin signo de 64 bits, produciendo un producto de 128 bits. Hay dos formas obvias de hacer esto, una usando turnos largos y sumas para cada una de las 64 iteraciones, y otra usando 4 llamadas a una rutina de suma de 32 bits.

Aritmética decimal codificada en binario

Si bien la aritmética binaria es fácil, no es la única alternativa. La mayoría de las computadoras construidas en las décadas de 1940 y 1950 usaban decimal, y el decimal sigue siendo común hoy en día porque algunos lenguajes de programación, en particular COBOL, lo requieren. Es cierto que COBOL es un lenguaje arcaico, pero millones de líneas de código escritas en COBOL permanecen en el corazón de los sistemas de información de gestión empresarial de la mayoría de las principales corporaciones de los Estados Unidos, por lo que no se puede ignorar el soporte eficiente para este lenguaje. Además, muchos instrumentos de laboratorio usan decimal porque su salida principal es una pantalla decimal, y cuando estos instrumentos tienen interfaces de computadora, los datos generalmente se envían en decimal. Las representaciones numéricas internas que se utilizan en la mayoría de las calculadoras de bolsillo también son decimales.

¿Cómo se manipulan los números decimales en computadoras binarias? Hay dos esquemas comunes, decimal codificado en binario y tres en exceso. Ambos usan 4 bits por dígito decimal, pero los sistemas de codificación difieren:

Representaciones de dígitos decimales
BCD decimal Exceso 3
0000 0 0011
0001 1 0100
0010 2 0101
0011 3 0110
0100 4 0111
0101 5 1000
0110 6 1001
0111 7 1010
1000 8 1011
1001 9 1100


El decimal codificado en binario o BCD utiliza la representación binaria natural para cada dígito decimal, mientras que el exceso de 3 suma tres al valor binario simple de cada dígito. La razón por la que esto es útil se aclarará en un momento, pero una de las ventajas de esto es que el sistema de tres en exceso es simétrico en el sentido de que los números 5 y superiores están representados por los complementos a uno de los números inferiores a 5. Esto hace que el complemento a decenas Las representaciones de números con signo funcionan bien, si se supone que los valores del dígito decimal más significativo de 5 o más representan números negativos.

La parte difícil de diseñar un sumador decimal es averiguar cuándo generar una ejecución de cada posición de dígito decimal. Hacemos esto cuando la suma de dos dígitos es mayor que 10. Podríamos construir un sumador decimal directamente, con circuitos para comparar los dígitos de la suma con 10, pero hay una forma más sencilla. El truco, conocido desde la década de 1950, consiste en sesgar los números para que la ejecución binaria simple de la posición de cada dígito sea la correcta. Hacemos esto agregando 6 a cada dígito BCD de la suma, o alternativamente, usando una representación de exceso de 3 donde se incluye un 3 adicional en cada dígito. Por supuesto, una vez hecho esto, se deben hacer correcciones al resultado. Aquí hay un ejemplo de problema de suma, hecho con números BCD de 8 bits y 2 dígitos:

Adición de BCD
1 1 1 llevar bits
0 1 0 0 0 1 0 1 sumando = 45
0 1 0 0 0 1 1 0 augend = 46
+ 0 1 1 0 0 1 1 0 seises
1 1 1 1 0 0 0 1 suma preliminar
& ndash01 1 0 0 0 0 0 corrección
1 0 0 1 0 0 0 1 la suma = 91

En este caso, la suma inicial de los dígitos decimales que produjeron un acarreo es correcta, pero la suma de los dígitos que no produjeron un acarreo es de 6. Para solucionar este problema, restamos 6 de los dígitos que no produjeron un acarreo. Con la representación de exceso de tres, la corrección requerida es solo ligeramente diferente: restamos 3 de los dígitos que no produjeron un acarreo y agregamos tres a los dígitos que sí lo hicieron.

El campo de acarreo BCD en la palabra de estado del procesador del Hawk registra la ejecución de cada dígito decimal después de cada instrucción de suma. La idea está tomada de Intel 8080. El único uso de este campo es admitir BCD y aritmética de exceso de 3.

Soporte para aritmética BCD en la palabra de estado del procesador Hawk
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Llevar BCD norte Z V C


El campo de acarreo BCD es utilizado por la instrucción ADJUST para realizar el ajuste apropiado después de la instrucción ADD preliminar para completar la suma BCD o exceso-3, como se ilustra aquí:

Adición de BCD y Excess-3 en el Hawk

Aquí, la ventaja del exceso-3 debería ser clara: con BCD, debemos mantener la constante 66666666 16 en un registro, y siempre debemos sumar esta constante a uno de nuestros operandos antes de cada adición. Con un exceso de 3, debido a que el 6 adicional se incorpora a los valores antes de la suma, todo lo que necesitamos hacer es hacer una corrección un poco más compleja después de cada suma.

Ejercicios

t) Escriba el código Hawk para tomar el complemento de 10 de un número BCD y luego explique cómo detectar si el resultado es positivo o negativo.

u) Escriba el código de Hawk para tomar el complemento de 10 de un número 3 en exceso y luego explique cómo detectar si el resultado es positivo o negativo.

v) Escriba el código Hawk para convertir de 3 en exceso a BCD y de BCD a 3 en exceso.

w) Qué valor se suma o se resta de cada dígito decimal por el AJUSTE. Instrucción EX3? Puede que tenga que trabajar con algunos ejemplos para resolver esto.

Aritmética binaria de punto fijo

La aritmética de coma flotante es una característica común de las computadoras modernas, pero al comienzo de la era de las computadoras, no era obvio que fuera necesaria. Se dice que John Von Neumann dijo que "un buen programador debería ser capaz de mantener el punto en la cabeza", cuando alguien le preguntó sobre el valor del hardware de punto flotante. ¿Cómo mantienes el punto en tu cabeza? La respuesta es muy sencilla. Haces aritmética usando números enteros, pero en lugar de contar, digamos, números enteros de pulgadas, cuentas números enteros de pulgadas fraccionarias. Si está trabajando en base 10, podría hacerlo en centésimas de pulgada. Si está trabajando en binario, puede usar 128 milésimas de pulgada.

Los números binarios de 32 bits representados como recuentos enteros de 128 milésimas de pulgada se pueden pensar de la siguiente manera:

Números de punto fijo con una precisión de 1/128
24 23 22 21 20 19 18 14 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 -1 -2 -3 -4 -5 -6 -7
Parte entera Fracción


Los bits de la fracción de punto fijo indicados anteriormente se han vuelto a numerar, por lo que en lugar de considerar que el bit más significativo es el bit 31, es el bit 24, y en lugar de considerar que el bit menos significativo es el bit 0, es el bit & ndash7. Esto se debe a que el bit menos significativo tiene el peso 2 & ndash7 en el sistema de valor posicional, o 1/128, y el bit más significativo tiene el valor 2 24. Es útil numerar los bits para que el lugar de la unidad esté numerado como 0. Cuando escribimos un número en un papel, esto es exactamente lo que significa el punto. Es por eso que evitamos el uso del término punto decimal aquí, porque el punto no depende de ninguna manera de la base numérica & mdash en ninguna base numérica, sin embargo, marca el lugar de la unidad, o la línea divisoria entre la parte entera de el número y la parte fraccionaria.

Considere el número binario 0.1000000, esto es 1/2 o 64/128. De manera similar, 0.0100000 es 1/4 o 32/128 en el sistema numérico de punto fijo descrito anteriormente. Si queremos representar 0.1 10, no podemos hacerlo exactamente en este sistema, lo más cerca que podemos llegar son 0.0001100, que es 12/128 o 0.9375, en el lado bajo, y 0.0001101, que es 13/128 o 0.1015625, en el lado bajo. zona alta. El problema fundamental al que nos enfrentamos es que no existe una representación exacta de una décima en binario, al igual que no existe una representación exacta de 1/3 en decimal. Todo lo que podemos esperar es una buena aproximación.

Las reglas para tratar con la aritmética binaria de coma fija son exactamente las reglas familiares para tratar con fracciones decimales. Al sumar o restar dos números de coma fija, primero cámbielos para alinear los puntos y luego sume o reste. Al multiplicar, primero multiplique y luego cuente los dígitos que quedan del punto en el multiplicador y el multiplicando y luego cuente la suma de estos para determinar dónde va el punto en el producto.

Un programador en C que usa la representación numérica de punto fijo aquí haría aritmética de la siguiente manera:

Aritmética de punto fijo en C

Desafortunadamente, lenguajes como C y Java no brindan ayuda al programador cuando hace aritmética de punto fijo.Por lo tanto, depende del programador recordar cambiar todas las constantes apropiadamente, o codificarlas con el sesgo incorporado correcto, y depende del programador recordar cambiar los operandos hacia la izquierda o hacia la derecha según sea necesario. Esto es algo que John Von Neumann pensó que los programadores podían hacer mentalmente, pero estaba claro a principios de la década de 1960 que los programadores tenían dificultades reales para hacerlo. El hardware o software de punto flotante elimina la necesidad de esto.

Ejercicios

x) Dado que el divisor y el dividendo tienen puntos en el mismo lugar, ¿dónde está el punto en el cociente? ¿Dónde está el punto en el resto? Para un ejemplo concreto, considere la posibilidad de que tanto el divisor como el dividendo tengan 7 lugares después del punto.

y) Dar el código Hawk para dividir un número de punto fijo en complemento a 2 dado en el registro 3 en su parte entera, en el registro 3, y su parte fraccionaria, en el registro 4. El número inicial debe tener 7 lugares después del punto. La parte fraccionaria del resultado tendrá un bit para el signo y 31 bits después del punto.


2.8: Multiplicar y dividir enteros (Parte 2)

¡Aprenda a dividir enteros en lenguaje ensamblador MIPS!

Índice de cursos

  1. Intro y Marte
  2. Registros
  3. ¡Hola Asamblea!
  4. Imprimir un personaje
  5. Imprimir un entero
  6. Imprimir un flotador
  7. Imprimir un doble
  8. Sumar enteros
  9. Restar enteros
  10. Multiplicar enteros mul
  11. Multiplicar enteros mult
  12. Multiplicar enteros sll
  13. División de enteros parte 1
  14. División de enteros parte 2
  15. Introducción a las funciones
  16. Argumentos de función y valores devueltos
  17. Guardar registros en la pila
  18. Procedimientos anidados
  19. Obtener enteros de entrada del usuario
  20. Obtener flotantes de entrada del usuario
  21. Obtener el doble de la entrada del usuario
  22. Obtener texto del usuario
  23. Si instrucciones de ramificación de declaraciones
  24. Comprobación de si un número es menor que otro slt
  25. Pseudoinstrucciones de ramificación
  26. Mientras bucle en MIPS
  27. Matrices
  28. Impresión de una matriz con un bucle while
  29. Inicializador de matriz
  30. Aritmética de coma flotante
  31. Más acerca de la aritmética de punto flotante
  32. If declaraciones con flotantes y dobles
  33. Introducción a la recursividad
  34. Programa factorial recursivo
  35. Manipulación de bits
  36. Programa promedio
  37. Matrices 2D
  38. Implementación de matrices 2D

Descripción del curso

Ya sea que se esté preparando para un curso en lenguaje ensamblador o simplemente esté interesado en aprender ensamblador, esta serie de tutoriales lo guiará paso a paso en su camino para convertirse en un programador competente en ensamblador MIPS.


Plus One Computer Science Notes Capítulo 2 Representación de datos y álgebra booleana

Sistema de numeración:
Es una forma sistemática de representar números de diferentes formas. Cada sistema numérico tiene su propia Base, que es un número y ese número de símbolos o dígitos utilizados.

  1. Dígito más significativo (MSD): el dígito con mayor peso se llama MSD. MSD también se llama el dígito más a la izquierda (LMD)
  2. Dígito menos significativo (LSD): el dígito con menor peso se llama LSD. El LSD también se denomina Dígito más a la derecha (RMD)
    • Ej .: 106: Aquí MSD: 1 y LSD: 6
    • 345.78: Aquí MSD: 3 y LSD: 8
  3. Un dígito binario también se llama bit.
  4. El peso de cada dígito de un número se puede representar por la potencia de su base.

Conversiones de números:
En general, para convertir un número decimal en otro sistema numérico (binario, octal o hexadecimal), haga lo siguiente. Divida el número sucesivamente por la base del sistema numérico que desea convertir y anote el resto de abajo hacia arriba.

Para convertir una fracción decimal en otro sistema numérico, multiplique el número por la base del sistema numérico que desea convertir, luego la parte entera y la parte fraccionaria se separan nuevamente, multiplique la parte fraccionaria por la base y realice los pasos repetidamente hasta la parte fraccionaria se convierte en cero. Finalmente, escriba la parte entera de arriba a abajo.

Decimal a binario:
Divida el número por la base 2 sucesivamente y anote el resto de abajo hacia arriba.

De fracción decimal a binario:
multiplica el número por la base 2 y luego la parte entera y la parte fraccionaria se separan nuevamente, multiplica la parte fraccionaria por la base 2 y repite los pasos repetidamente hasta que la parte fraccionaria se convierta en cero. Finalmente, escriba la parte entera de arriba a abajo.

Decimal a Octal:
Divida el número por la base 8 sucesivamente y anote el resto de abajo hacia arriba.

De fracción decimal a octal:
multiplica el número por la base 8 y luego la parte entera y la parte fraccionaria se separan nuevamente, multiplica la parte fraccionaria por la base 8 y repite los pasos repetidamente hasta que la parte fraccionaria se convierta en cero. Finalmente, escriba la parte entera de arriba a abajo.
por ejemplo: (55)10 = ()8

(0.140625)10 = (0.11)8

Decimal a hexadecimal:
Divida el número por la base 16 sucesivamente y anote el resto de abajo hacia arriba.

De fracción decimal a hexadecimal:
multiplica el número por la base 16 y luego la parte entera y la parte fraccionaria se separan nuevamente, multiplica la parte fraccionaria por la base 16 y repite los pasos repetidamente hasta que la parte fraccionaria se convierta en cero. Finalmente, escriba la parte entera de arriba a abajo.

Conversión de un número de cualquier sistema numérico a decimal: Para esto, multiplique cada dígito por su peso correspondiente y súmalo.

Conversión de binario a decimal:
Para esto, multiplique cada bit por su peso correspondiente y súmalo. Los pesos son potencia de 2.

Conversión de fracción binaria a decimal

101.101 = 1 × 2 2 + 0 × 2 1 + 1 × 2 0 + 1 × 2 -1 + 0 × 2 -2 + 1 × 2 -3
= 4 + 0 + 1 + 1/2 + 0 + 1/8
= 5 + 0.5 + 0.125
(101.101)2 = (5.625)10

Conversión de octal a decimal:
Para esto, multiplique cada bit por su peso correspondiente y súmalo. Los pesos son potencia de 8.
Por ejemplo: (1007)8 =()10?

1 × 8 3 + 0 × 8 2 + 0 × 8 1 + 7 × 8 0
= 512 + 0 + 0 + 7
=(519)10
Conversión de fracción octal a decimal (600.005)8 =()10?

= 6 × 8 2 + 0 × 8 1 + 0 × 8 0 + 0 × 8 -1 + 0 × 8 -2 + 5 × 8 -3
= 384 + 0 + 0 + 0 + 0 + 0.009765625
= (384.009765625)10

Conversión de hexadecimal a decimal:
Para esto, multiplique cada bit por su peso correspondiente y súmalo. Los pesos son potencia de 16.
Por ejemplo: (100)16 = ()10?

= 1 × 16 2 + 0 × 16 1 + 0 × 16 0
= 256 + 0 + 0
= (256)10
Conversión de fracción hexadecimal a decimal (60A.4)8 =()10?

= 6 x 16 2 + 0 x 16 1 + 10 x 16 0 + 4 x 16 -1
= 1536 + 0 + 0 + .25
= (1536.25)10

Conversión octal a binaria:
Convierta cada dígito octal en su equivalente binario de 3 bits. Considere la siguiente tabla

Conversión hexadecimal a binaria:
Convierta cada dígito hexadecimal en su equivalente binario de 4 bits. Considere la siguiente tabla

1010 1011 1100 (ABC)16=(101010111100)2

Conversión de binario a octal
Divida el número binario en grupos de 3 bits comenzando de derecha a izquierda (pero en la parte fraccionaria comience a dividir de izquierda a derecha). Inserte los ceros necesarios en el lado izquierdo (o el lado derecho en el caso de la parte fraccionaria) si es necesario y escriba el equivalente octal correspondiente.
por ejemplo: (10100110)2= ()8?
Inserte un cero en el lado izquierdo para formar un grupo de 3 bits

(10100110)2= (246)8

Conversión binaria a hexadecimal:
Divida el número binario en grupos de 4 bits comenzando de derecha a izquierda (pero en la parte fraccionaria comience a dividir de izquierda a derecha). Inserte los ceros necesarios en el lado izquierdo (o el lado derecho en el caso de la parte fraccionaria) si es necesario y escriba el equivalente hexadecimal correspondiente.
por ejemplo: (100100110)2 = ()16?
Inserte 3 ceros en el lado izquierdo para formar un grupo de 4 bits

(100100110)2 = (126)16

Conversión de octal a hexadecimal:
Primero convierta el número octal en binario (vea 1.6.7), luego convierta este binario en hexadecimal (vea también 1.6.10)
por ejemplo: Convertir (67)8 = ( )16
Paso I: Primero convierta este número en equivalente binario para esto, haga lo siguiente:

Paso II: A continuación, convierta este número en equivalente hexadecimal para esto, haga lo siguiente.

Entonces la respuesta es (67)8 = ( 37)16

Conversión hexadecimal a octal:
Primero convierta hexadecimal a binario (vea 1.6.8), luego convierta este binario en octal (vea también 1.6.9)
por ejemplo: Convertir (A1)16 = ( )8?
Paso I: Primero convierta este número en equivalente binario. Para esto haga lo siguiente

Paso II. A continuación, convierta este número en equivalente octal. Para ello, haga lo siguiente.
Entonces la respuesta es (A1)16 = (241)8

Representación de datos:
Los datos almacenados en la memoria de la computadora están en forma binaria.

Representación de enteros
Hay tres formas de representar números enteros en una computadora. Son los siguientes:

  1. Representación de signo y magnitud (SMR)
  2. Representación del complemento de 1
  3. Representación de complemento de 2

1. SMR:
Normalmente, un número tiene dos partes, signo y magnitud, por ejemplo: Considere un número + 5. Aquí + es el signo y 5 es la magnitud. En SMR, el bit más significativo (MSB) se utiliza para representar el signo. Si MSB es 0, el signo es + ve y MSB es 1, el signo es -ve. Por ejemplo: si una computadora tiene un tamaño de palabra de 1 byte, entonces

Aquí MSB se usa para el signo, luego los 7 bits restantes se usan para representar la magnitud. Entonces podemos, representar 2 7 = 128 números. Pero hay números positivos y negativos. Entonces 128 + 128 = 256 número. Los números son del 0 al +127 y del 0 al -127. Aquí se repite el cero. Entonces podemos representar 256 & # 8211 1 = 255 números.

2. Representación del complemento de 1:
Para obtener el complemento de 1 de un número binario, simplemente reemplace cada 0 con 1 y cada 1 con 0. Los números negativos se representan usando el complemento de 1, pero el número + ve no tiene el complemento de 1,
p.ej:
(i) Para encontrar el complemento a 1 de -21
+21 = 00010101
Para obtener el complemento de 1, cambie todo 0 a 1 y todo 1 a 0.
-21 = 11101010
El complemento a 1 de 21 es 11101010

(ii) Encuentre el complemento 1 & # 8217s de +21. Los números positivos se representan mediante SMR.
+21 = 00010101 (No es necesario tomar el complemento 1 & # 8217s)

3. Representación del complemento de 2:
Para obtener el complemento a 2 de un número binario, simplemente agregue 1 al complemento a 1 + ve número no tiene complemento a 2.
Ej .: Para encontrar el complemento a 2 de -21
+21 = 00010101
Primero tome el complemento a 1 para este cambio todo 1 a 0 y todo 0 a 1

El complemento a 2 de -21 es 1110 1011

Representación de números de coma flotante:
Un número real consta de una parte entera y una parte fraccionaria y se representa mediante el método de exponente y mantisa. Este método también se utiliza para representar números demasiado grandes y números demasiado pequeños.
Por ejemplo: .0000000000000000000000001 se puede representar fácilmente como 1 × 10 -25. Aquí T es la Mantisa y -25 es el exponente.

Una computadora con una longitud de palabra de 32 bits se usa 24 bits para mantisa y los 8 bits restantes se usan para almacenar exponente.

Representación de personajes:
1. ASCII (Código estándar americano para el intercambio de información):
Es un código de 7 bits que se utiliza para representar caracteres alfanuméricos y algunos caracteres especiales en la memoria de la computadora. Lo introduce el gobierno de EE. UU. Cada carácter del teclado tiene un número único.

Por ejemplo: el código ASCII de "a" es 97, cuando presiona "a" en el teclado, se pasa una señal equivalente a 1100001 (el equivalente binario de 97 es 1100001) a la memoria de la computadora. 2 7 = 128, por lo tanto, podemos representar solo 128 caracteres usando ASCII. No es suficiente representar todos los caracteres de un teclado estándar.

2. EBCDIC (Código de intercambio decimal codificado en binario extendido):
Es un código de 8 bits introducido por IBM (lnternational Business Machine). 2 8 = 256 caracteres se pueden representar usando esto.

3. ISCII (Código estándar de la India para el intercambio de información):
Utiliza 8 bits para representar datos y fue introducido por el comité de estandarización y adoptado por la Oficina de Estándares de la India (BIS).

4. Unicode:
Las limitaciones para almacenar más caracteres se resuelven con la introducción de Unicode. Utiliza 16 bits, por lo que 2 16 = 65536 caracteres (es decir, todos los caracteres del lenguaje escrito en el mundo) se pueden almacenar usando esto.

Aritmética binaria:
Suma binaria:
Las reglas para agregar dos bits

Por ejemplo: Encuentre la suma de los números binarios 110011 y 100001.

Resta binaria:
Las reglas para restar un dígito binario de otro dígito.

Resta usando el complemento de 1:
Los pasos se dan a continuación:

Paso 1: Suma ceros a la izquierda del sustraendo, para hacer dos números con el mismo número de bits.
Paso 2: Encuentre el complemento de 1 del sustraendo.
Paso 3: Agrega el complemento con minuendo.
Paso 4: Si hay un acarreo, ignore el acarreo, el resultado es positivo y luego agregue el acarreo 1 al resultado.
Por ejemplo: Reste 1101 de 111100 usando el método del complemento a 1.
Paso 1: Inserte dos O a la izquierda de 1101. Por lo tanto, el sustraendo es 001101.
Paso 2: el complemento a 1 de 001101 es 110010
Paso 3: agregue esto al minuendo.

Paso 4: ignore el acarreo, el resultado es positivo y agregue agregue el acarreo 1 a 101110

Por tanto, el resultado es 101111.

Resta usando el complemento de 2:
Los pasos se dan a continuación:
Paso 1: Suma ceros a la izquierda del sustraendo, para hacer dos números con el mismo número de bits.
Paso 2: Encuentra el complemento de 2 del sustraendo.
Paso 3: Agrega el complemento con minuendo.
Paso 4: Si hay un acarreo, ignore el acarreo, el resultado es positivo.
Por ejemplo: Reste 1101 de 111100 usando el método del complemento a 2.
Paso 1: Inserte dos ceros a la izquierda de 1101. Por lo tanto, el sustraendo es 001101.
Paso 2: Encuentre el complemento a 2 de 001101.
El complemento a 1 es 110010.
El complemento a 2 es 110010 + 1 = 110011
Paso 3: agregue esto al minuendo.

Paso 4: Ignore el acarreo, el resultado es positivo. Por tanto, el resultado es 101111.

Introducción al álgebra de Boole:
El nombre de Álgebra de Boole se le da en honor al matemático británico George Boole. El álgebra booleana trata con dos estados verdadero o falso, de lo contrario Sí o No y numéricamente 0 o 1.

Cantidades valoradas en binario:
Una decisión lógica que da valores SÍ o No es una decisión binaria. Una declaración que da valores SÍ o NO (VERDADERO o FALSO) es una declaración lógica o función de verdad. Una variable que puede asignar valores VERDADERO o FALSO (1 o 0) es una variable lógica

Operadores booleanos y puertas lógicas:
Los operadores lógicos son Y, O y NO. Una puerta lógica es un dispositivo físico (circuito electrónico) que puede realizar operaciones lógicas en una o más entradas lógicas y producir una única salida lógica. Una tabla representa el conjunto de todos los valores posibles y los resultados correspondientes en una declaración se llama tabla de verdad.
1. El operador OR y la puerta OR:
El operador OR da un 1 cualquiera de los operandos es 1. Si ambos operandos son 0, produce 0. La tabla de verdad de X OR Y es

La puerta OR lógica se muestra a continuación.

La tabla de verdad y la puerta de la expresión booleana Y = A + B + C

2. El operador AND y la puerta AND:
El operador AND da un 1 si y solo si ambos operandos son 1. Si cualquiera de los operandos es 0, produce 0 La tabla de verdad de X AND Y es

La puerta Y lógica se da a continuación.

La tabla de verdad y la puerta de la expresión booleana Y = A. B . C

3. El operador NO y NO puerta:
Produce lo contrario. La puerta NOT también se llama inversor. Es un operador unario, lo que significa que solo tiene una entrada y una salida. La tabla de verdad de NOT X es

Postulados básicos del álgebra de Boole:
El álgebra de Boole consta de algunas leyes fundamentales. Estas leyes se llaman postulados.
Postulado 1: Principios de 0 y 1
Si A ≠ 0, entonces A = 1 y A 1, entonces A = 0

Principio de dualidad:
Al cambiar OR (+) a AND (.), Y (.) A OR (+), 0 a 1 y 1 a 0 en una expresión booleana obtendremos otra relación booleana que es el dual de la primera, esta es el principio de dualidad.

Teoremas básicos del álgebra de Boole:
Hay algunas reglas estándar y aceptadas en cada teoría, estas reglas se conocen como axiomas de la teoría.

Ley de identidad:
Si X es una variable booleana, la ley establece que

  1. 0 + X = X
  2. 1 + X = 1 (estas son leyes de identidad aditiva)
  3. 0. X = 0
  4. 1. X = X (estas son leyes de identidad multiplicativas)

A continuación se muestran las tablas de verdad

Ley idempotente:
Esta ley establece que

Ley de involución:
Esto establece que
( overline < overline < mathrm>> = mathrm)
El cumplido de un número es el número en sí.

Ley complementaria:
Esta ley establece que

La tabla de verdad se da a continuación.

Ley conmutativa:
Esta ley permite cambiar la posición de la variable en OR y AND

La tabla de verdad se da a continuación.

Ley asociativa:
Permite agrupar variables de forma diferente

La tabla de verdad se da a continuación.

Ley distributiva:
Esta ley permite la expansión de la multiplicación sobre la suma y también permite la operación de suma sobre la multiplicación.

La tabla de verdad se da a continuación.

Ley de absorción:
Es una especie de ley distributiva en la que se utilizan dos variables y el resultado será una de ellas.

La tabla de verdad se da a continuación.

Teorema de De Morgan:
El primer teorema de Demorgan establece que
( overline < mathrm+ mathrm> = overline < mathrm> cdot overline < mathrm>)
es decir. el cumplido de la suma de dos variables es igual al producto de sus cumplidos.

El segundo teorema establece que
( overline < mathrm. < mathrm>> = overline < mathrm> + overline < mathrm>)
es decir. El complemento del producto de dos variables es igual a la suma del complemento de esas variables.

Diseño de circuitos para expresiones booleanas simples:
Mediante el uso de puertas básicas como las puertas Y, O y NO, podemos crear circuitos lógicos.

Puertas universales:
Al usar solo las puertas NAND y NOR, podemos crear otras puertas, por lo que estas puertas se denominan puerta universal.

Puerta NAND:
La salida de la puerta Y se invierte por la puerta NO es la puerta NAND

Puerta NOR:
La salida de la puerta OR se invierte por la puerta NOT es la puerta NOR.


Mensaje visual n. ° 3: ¡Tu turno!

Pausa el video y deja que el espectador aplique sus conocimientos sobre número positivo dividido por un número negativo utilizando división partitiva en el siguiente mensaje visual:

10 ÷ (-5) = ___

o

10 divididos en -5 grupos dan un resultado de ___ por grupo

Deje tiempo para que el espectador participe en la división partitiva antes de mostrar el resto de la animación de video o la siguiente imagen fija.

Nuevamente, debemos tener en cuenta que queremos determinar el valor de la cantidad que se compartirá entre 5 grupos cargados negativamente o -5 grupos.

Al compartir de manera equitativa 10 entre los grupos -5, vemos que cada grupo contendrá 2 negativos o -2.

¿Qué tal abordar el mismo problema usando división de cotizaciones:

10 ÷ (-5) = ___

o

10 dividido en grupos de -5 da un resultado de ___ grupos

Al usar nuestra comprensión conceptual construida a través de las indicaciones visuales anteriores, ahora podemos reconocer que, dado que hay 0 grupos de -5 que podemos crear a partir del +10 dado, debemos usar grupos con carga negativa.

Como puedo crear 2 grupos de +5, sé que también puedo representar esos mismos dos grupos como -2 grupos de -5.

¡Ahí tienes! Comprender la división de enteros conceptualmente a través de representaciones concretas y visuales. En mi salón de clases, tengo estudiantes que usan baldosas de colores o unen cubos para manipular físicamente los materiales para conceptualizar completamente esta idea muy importante que a menudo se aborda utilizando solo reglas y procedimientos.

¿Usaste esto en tu salón de clases o en casa? ¿Cómo ha ido? ¡Publica en los comentarios!


Ver el vídeo: Mathematik Klasse 6 Homeschooling 2: Gebrochene Zahlen - Multiplikation u0026 Division (Septiembre 2021).