Introducción a la Programación 11‐O Humberto Cervantes Maceda Recordando En la sesión anterior vimos que la información almacenada en la memoria, y por lo tanto aquella que procesa la unidad central de procesamiento está almacenada como unos y ceros 100100011101101010010011001 Memoria Microprocesador Disco duro Bits Los unos y ceros se conocen como “bits” (digitos binarios) Patrones de bits son usados para representar valores numéricos así como otros símbolos tales como caracteres y signos, o bien imágenes y sonidos El sistema binario es un sistema de numeración en base 2 Operaciones booleanas Es conveniente considerar al bit 0 como una representación de falso y al bit 1 como una representación de verdadero Las operaciones que manipulan valores de verdadero y falso son llamadas operaciones booleanas En honor a George Boole (1815 – 1864), pionero de la lógica Tres operaciones booleanas básicas son: Y (AND), O (OR), O exclusivo (XOR) y NO Operación Y La operación booleana Y (&&) esta diseñada para reflejar si una sentencia compuesta por otras dos sentencias más simples es verdadera o falsa P Y Q, donde P y Q son sentencias Ej. La UAM es una universidad Y La UAM está en la ciudad de México P Y Q es verdadero si y sólo si P es verdadero y Q es verdadero 0 Y 0 ? 0 Y 1 ? 1 Y 0 ? 1 Y 1 ? Operación Y La operación booleana Y (&&) esta diseñada para reflejar si una sentencia compuesta por otras dos sentencias más simples es verdadera o falsa P Y Q, donde P y Q son sentencias Ej. La UAM es una universidad Y La UAM está en la ciudad de México P Y Q es verdadero si y sólo si P es verdadero y Q es verdadero 0 Y 0 → 0 0 Y 1 → 0 1 Y 0 → 0 1 Y 1 → 1 Operación O La operación booleana O (||) de manera similar está basada en sentencias compuestas de la forma P O Q Ej. Hoy es Martes O Hoy es Viernes P O Q es verdadero si al menos una de las sentencias es verdadera 0 O 0 ? 0 O 1 ? 1 O 0 ? 1 O 1 ? Operación O La operación booleana O (||) de manera similar está basada en sentencias compuestas de la forma P O Q Ej. Hoy es Martes O Hoy es Viernes P O Q es verdadero si al menos una de las sentencias es verdadera 0 O 0 → 0 0 O 1 → 1 1 O 0 → 1 1 O 1 → 1 Operación O exclusivo La operación booleana O exclusivo permite expresar sentencias del tipo “Ya sea P verdadero o Q verdadero pero no ambas” P XOR Q P XOR Q es verdadero si P verdadero o Q verdadero pero no ambas 0 XOR 0 ? 0 XOR 1 ? 1 XOR 0 ? 1 XOR 1 ? Operación O exclusivo La operación booleana O exclusivo permite expresar sentencias del tipo “Ya sea P verdadero o Q verdadero pero no ambas” P XOR Q P XOR Q es verdadero si P verdadero o Q verdadero pero no ambas 0 XOR 0 → 0 0 XOR 1 → 1 1 XOR 0 → 1 1 XOR 1 → 0 Operación NO La operación No (!) es otra operación booleana que difiere de las anteriores pues sólo tiene una entrada. La salida es el opuesto de la entrada NO 1 → 0 NO 0 → 1 Ej. Pedro es un estudiante Pedro no es un estudiante De binario a decimal Un número binario está representado por una secuencia de varios bits Comúnmente un número de 8 bits se conoce como un byte Ej. 01101110, 01010101, 11100010 Ejemplo de conversión binario a decimal 2^7 2^62^5 2^4 2^3 2^2 2^1 2^0 Notación hexadecimal La notación hexadecimal permite representar patrones de 4 bits con un solo símbolo 0000 → 0 0001 → 1 0010 → 2 0011 → 3 0100 → 4 0101 → 5 0110 → 6 0111 → 7 1000 → 8 1001 → 9 1010 → A 1011 → B 1100 → C 1101 → D 1110 → E 1111 → F Almacenamiento en memoria La memoria de la computadora está organizada en celdas, y un tamaño típico de una celda es un byte Bit más significativo Bit menos significativo 1 Kilobyte = 1024 bytes Representación de datos en memoria La información está codificada en la memoria como patrones de bits. Texto Datos numéricos Imágenes Sonido Texto En los 60’s apareció el código ASCII (American Standard Code for Information Exchange) 128 caracteres: 33 de control y 94 normales Carácter #65 Hoy en día: UTF‐8, Unicode Números La representación de enteros positivos es relativamente directa 10010101 = 2^0 + 2^2 + 2^5 + 2^8 = 1 + 4 + 16 + 128 = 149 Cuál sería un algoritmo para convertir de decimal a binario? De decimal a binario Algoritmo 1.‐ Dividir la cantidad entre dos y registrar el residuo 2.‐ Mientras que el cociente no sea cero, continuar dividiendo el nuevo cociente por dos y registrar los residuos 3.‐ Una vez que se obtiene un cociente de cero, la representación binaria consiste en los residuos listados de derecha a izquierda en el orden en que fueron registrados Ejemplo Pasar a binario el número 13 13 / 2 = 6 resta 1 6 / 2 = 3 resta 0 3 / 2 = 1 resta 1 1 / 2 = 0 resta 1 La representación binaria de 13 es 1101 Suma binaria La suma binaria es muy similar a la suma en el sistema decimal 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = ? 111010 + 11011 = ? Suma binaria La suma binaria es muy similar a la suma en el sistema decimal 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 10 111010 + 11011 = 1010101 Almacenamiento de enteros Los enteros Z están formados por los números naturales incluyendo 0 (0,1,2,3…) y los negativos de los números naturales excluyendo el cero (‐1,‐2,‐3…) El sistema más popular para la representación de enteros es el sistema de complemento a dos Complemento a dos El complemento a dos permite expresar enteros negativos Para calcularlo Recorrer de derecha a izquierda hasta toparse con un 1. Copiar los números recorridos incluyendo el 1. A partir de ahí, negar los dígitos restantes. Otra opción es negar todos los dígitos y sumar 1 al resultado El bit a la izquierda es el bit de signo Suma en notación de complemento a dos Para la suma en notación de base dos, se usa el mismo procedimiento que para la suma binaria estándar quitando cualquier bit adicional que se produzca de la suma Ej. 7 + (‐5) = 0111 + 1011 = ? De aquí ya podemos ver la manera de realizar restas Sobreflujo El sobreflujo puede ocurrir cuando se tiene una suma de dos números de n bits y el resultado de la suma ocupa n+1 bits Ejemplo: Suma de 5 + 4 : 0101 + 0100 = ? Sobreflujo El sobreflujo puede ocurrir cuando se usa notación de complemento a dos y se tiene una suma de dos números de n bits y el resultado de la excede el rango que se puede representar con los n bits. Ejemplo: Suma de 5 + 4 : 0101 + 0100 = 1001 = ‐7 Dependiendo del tipo de dato que se usa, puede se un problema que no ocurre tan frecuentemente Ej. 32 bits permite enteros positivos de hasta 2,147,483,647 Sin embargo es por esta razón que debemos cuidar el tipo de dato que se elige para almacenar una variable Tipos de datos en Java byte: 8 bits con signo (‐128, 127) short: 16 bits con signo (‐32’768, 32’767) int: 32 bits con signo (‐2’147’483’648, 2’147’483’647) long: 64 bits con signo (‐9’223’372’036’854’775’808, 9’223’372’036’854’775’807) float: Punto flotante de 32 bits double: Punto flotante de 64 bits char: Unicode de 16 bit Decimales en binario Para transformar de entero con decimales a binario 1.‐ Se transforma la parte entera a binario 2.‐ Se multiplica cada número de la parte fraccionaria por dos. Si el resultado es mayor o igual a 1 se anota como un 1 binario, de lo contrario es un cero binario Decimales en binario Ejemplo: 6.83 6 → 110 0.83 x 2 → 1.66 = 1 0.66 x 2 → 1.32 = 1 0.32 x 2 → 0.64 = 0 0.64 x 2 → 1.28 = 1 0,28 x 2 → 0,56 = 0 0,56 x 2 → 1,12 = 1 0,12 x 2 → 0,24 = 0 0,24 x 2 → 0,48 = 0 0,48 x 2 → 0,96 = 0 0,96 x 2 → 1,92 = 1 0,92 x 2 → 1,84 = 1 0,84 x 2 → 1,68 = 1 El resultado sería entonces: 110.110101000111 Nota: Algunos números se transforman en dígitos periódicos por ej. 0.1 Almacenamiento de decimales A diferencia del almacenamiento de enteros, el almacenamiento de un valor con una parte decimale requiere además del patrón de 1s y 0s un valor con la posición del punto. Es por esto que se habla de “punto flotante” Ejemplo con un byte: 01101011, suponiendo Un bit de signo tres bits para el exponente cuatro bits para la mantisa Almacenamiento de fracciones Ejemplo con un byte: 01101011, suponiendo Un bit de signo: 0 tres bits para el exponente: 110 cuatro bits para la mantisa: 1011 La interpretación del exponente se hace usando un método llamado “en exceso” Notación en exceso Este es otro método para almacenar enteros con signo. En este método, el patrón con un uno a la izquierda y los demás digitos en cero es considerado el cero entero. 1111 → 7 1110 → 6 1101 → 5 1100 → 4 1011 → 3 1010 → 2 1001 → 1 1000 → 0 0111 → ‐1 0110 → ‐2 0101 → ‐3 0100 → ‐4 0011 → ‐5 0010 → ‐6 0001 → ‐7 0000 → ‐8 111 → 3 110 → 2 101 → 1 100 → 0 011 → ‐1 010 → ‐2 001 → ‐3 000 → ‐4 Almacenamiento de fracciones Ejemplo con un byte: 01101011, suponiendo Un bit de signo: 0 (más) tres bits para el exponente: 110 cuatro bits para la mantisa: 1011 La interpretación de la parte decimal se usa un método llamado “en exceso” 110 = 2 esto nos dice de mover el punto a la derecha en 2 bits (si el valor fuera negativo, lo moveríamos a la izquierda) Obtenemos entonces 10.11 → 1x2^1 + 0x2^0 . 1 / 2^1 + 1 / 2^2 = 2.75