C LA S E D E H EX A D EC IM A L Ø ØB Byy uuL LZZaaN Naa INTRODUCCION La base fundamental de la información digital, es el bit. Un bit no puede almacenar mucha información por si solo; dispone de un corto menú: activado(on), desactivado(off), 1 o 0, alto o bajo. Pero en el chip correcto en el momento preciso, un solo bit puede activar instrucciones que cambian o mueven muchos otros bits, y cuando se empiezan a mover a la vez millones de ellos a una velocidad increíblemente rápida, se pueden hacer cosillas. A algunas personas, les encanta cambiar el estado de las cosas, pero un bit solo puede estar en un estado o en otro. La numeración binaria tiene mucho sentido en un ordenador digital, un sistema formado de cientos de miles de conmutadores interconectados que están activados o desactivados. Pero los bits son mas útiles cuando están organizados en grupos de 8 llamados bytes. Un byte es una forma de almacenar 8 piezas relacionadas de información, y resulta útil para representar un numero, una letra o un carácter Normalmente tu sistema informático, está preparado para mover información en bloques de uno, dos, o cuatro bytes, dependiendo si utilizas un ordenador de 8, 16, 0 32 bits, en lugar de hacerlo con grandes números de bits diferentes. Trabajar con números binarios o hexadecimales, no es esencialmente mas difícil que trabajar con decimales; lo que ocurre es que tenemos mucha mas practica en cálculos decimales. Pero juega un rato con los números binarios y hexadecimales y aprenderás enseguida. Es probable que utilicemos el sistema decimal, (base 10), porque los seres humanos tenemos diez dedos en las manos y diez en los pies. Por ejemplo contemos los dedos de los pies. En decimal es fácil. Pero empecemos por el cero para hacerlo un poco menos aburrido. 0 1 2 3 4 5 6 7 8 9 Diez dedos de los pies, diez dígitos. En este momento uno ya se ha quedado sin dedos para seguir contando, Un dedo mas a contar y tendríamos que pasar a dígitos dobles. El sistema decimal tiene diez dígitos con los que jugar. Cuando se acaban, hay que empezar a utilizar mas de un dígito. Contar en binario es igual de fácil que en decimal, solo que tenemos nada mas que dos números con los que jugar el 0 y el 1. 0 1 10 11 100 101 110 111 1000 1001 A veces la gente rellena los números binarios con ceros, por lo que el proceso de contar los diez dedos en binario, podría quedar así: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 ¿ Como se traduce un numero decimal a formato binario ¿. La clave es sentirse cómodo con las potencias de 2. Recuerda que 2^0 es igual a 1. 2^15=32768 2^14=16384 2^13=8192 2^12=4096 2^11=2048 2^10=1024 2^9=512 2^8=256 2^7=128 2^6=64 2^5=32 2^4=16 2^3=8 2^2=4 2^1=2 2^0=1 Para convertir un numero binario dado a decimal, operaríamos de la siguiente forma: Sea el numero binario : 1001 1001 1101 Solo vamos a tener en cuenta los 1 que aparecen en el numero binario, despreciando los ceros a la hora de efectuar las distintas operaciones. Nos fijamos en la posición que ocupa, el primer 1de la izquierda , (los ceros a la izquierda no son significativos). En el ejemplo el primer uno está en la posición 12 contando de derecha a izquierda. Empezamos a convertir el numero multiplicando dicho 1, por 2 elevado a la posición en la que se encuentra –1. En el caso que nos ocupa como está en la posición 12, lo multiplicamos por 2^11, y nos quedaría: 1x2^11=1x2048=2048 Despreciamos los dos ceros que vienen a continuación, y operamos con el siguiente 1 que aparece igual que en el caso anterior. Este nuevo 1 está en la posición 9 contando de izquierda a derecha, por tanto nos quedaría: 2048 que teníamos anteriormente mas: 1x2^8= 2048 + 256 = 2304 y operando de igual forma nos quedaría: 2304 que teníamos anteriormente mas: 1x2^7 + 1x2^4 + 1x2^3 + 1x2^2 + 1x2^0 = 2304 + 128 + 16 + 8 + 4 + 1 = 2461 A la hora de convertir números decimales a binarios, realizaríamos la operación inversa, para ello es muy interesante que presentemos la tabla anterior de las potencias de dos, pero esta vez con el resultado en binario: 2^15=1000 2^14=0100 2^13=0010 2^12=0001 2^11=0000 2^10=0000 2^9 =0000 2^8 =0000 2^7 =0000 2^6 =0000 2^5 =0000 2^4 =0000 2^3 =0000 2^2 =0000 2^1 =0000 2^0 =0000 0000 0000 0000 0000 1000 0100 0010 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1000 0100 0010 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1000 0100 0010 0001 = = = = = = = = = = = = = = = = 32768 16384 8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1 Ahora tomemos el numero decimal que queramos traducir, por ejemplo el 13 La cuestión es ver cual de las potencias de 2 forman este numero. Consulta la tabla y mira cual es el mayor numero que es igual o mas pequeño, que el que se ha tomado para traducir(13). Evidentemente el numero buscado es el 8. Al 8 decimal le corresponde el 1000 binario, es decir estamos hablando de un numero binario de 4 dígitos y el primero mas a la izquierda es un 1, o sea que nos quedaría: 1_ _ _ Ahora de el numero buscado 13, le restamos el 8 y nos queda 5. Miramos de nuevo la tabla y vemos que el siguiente numero debajo del 8 es 4. Como se puede restar 4 de 5 sin obtener un numero negativo, ponemos otro 1 en la siguiente posición a la derecha y restamos 4 de 5 quedando un resto de 1. 11_ _ Consultamos de nuevo la tabla. El siguiente numero mas bajo después de 4 es 2. Sin embargo no se puede restar el 2 del 1, porque se obtendría un numero negativo. Por tanto ponemos un cero en la siguiente posición a la derecha. 110_ El ultimo numero de la tabla es el 1. Se puede restar 1 del resto que teníamos, 1, sin obtener todavía ningún numero negativo, así que ponemos un 1 final en la posición de la derecha. 1101 El numero 13 es igual por tanto al 1 1 0 1 binario, comprobamos: 1 x 2^3 + 1x2^2 +1x2^0 = 8 + 4 + 1 = 13 LOGICA DEL PROCESADOR Trabajar con los unos y ceros binarios es laborioso. Pero estos son muy útiles cuando hay que realizar operaciones lógicas. ¿ Por que el valor ASCII de la A es 65 y el de la a 97 ¿. Fíjate en las representaciones de las tres primeras letras del alfabeto A 65 0100 0001 a 97 0110 0001 6º bit =32 B b 66 0100 0010 98 0110 0010 6º bit =32 C c 67 0100 0011 99 0110 0011 6º bit =32 La versión en minúsculas de cada una de las letras es idéntica a la versión en mayúscula excepto que en todos los casos el sexto dígito binario hacia la derecha es un 1 en la versión minúscula y un 0 en la mayúscula. La forma mas fácil de averiguar el valor decimal de un bit binario es contar desde la derecha a la izquierda, “1,2,4,8,16,32,64,128,256,512,1024,2048,4096......etc.”, Si lo haces cuando llegues al 6º dígito habrás contado 32. También podrías recordar que el 6º bit equivale a 2^5=32. Si retas 65, (el valor de A mayúscula) de 97, (el valor de a minúscula), obtendrás 32. De esta forma puedes calcular al instante el valor de cualquier letra mayúscula, restando el 32 decimal del valor de la letra minúscula. Y naturalmente, puedes sumar 32 al valor ASCII de la letra mayúscula, para obtener el código ASCII de la letra minúscula. Ahora bien esta técnica que se puede utilizar letra a letra, en ningún caso podría utilizarse, para convertir ficheros de texto enteros, ya que si restamos 32 de todos los caracteres de un fichero de texto, convertiremos a mayúsculas, solo los caracteres correspondientes a letras minúsculas, pero nos saldrían cosas raras, si se tratara de restar 32 de letras mayúsculas, números u otro tipo de carácter distinto a las letras minúsculas.. Sin embargo el ordenador puede realizar esta tarea al instante utilizando operaciones lógicas. En este caso habría que utilizar la operación lógica AND, para convertir las letras en mayúsculas y la operación OR, para convertirlas en minúsculas. Las operaciones lógicas mas útiles son AND, OR, NOT y XOR. Estas son bastante intuitivas, pero al igual que los números binarios cuesta un poco acostumbrase a ellas. Piensa en ellas como si fuesen contratos legales.Si un contrato dice que tu recibirás dinero si: Escribes un articulo Y (AND) lo publicas en la web Obviamente solo cobraras si haces las dos cosas, pero no si solo haces una de ellas. Pero si el contrato dice que el dinero lo recibirás por: Escribes un articulo O (OR) lo publicas en la web Entonces únicamente habrás de hacer una de las dos cosas para cobrar tu dinero. Si un contrato dice que se te pagará si: NO (NOT), escribes ningún articulo este año. Solo cobraras si en todo el año no escribes artículos. La operación XOR, que significa OR exclusivo, simplemente cambia un estado binario por otro, pero también puede sumar números binarios como veremos mas adelante. Los ordenadores utilizan operaciones XOR para todo tipo de cosas. Si se aplica XOR aun valor con su mismo valor, este se cancela y se obtiene un cero. Si deseas producir animación gráfica, primero aplicas XOR a una imagen de la pantalla para dibujar algo en un determinado lugar, y después se vuelve a aplicar XOR a la misma imagen y en la misma posición, para volver a poner la pantalla tal y como estaba originalmente. Como la segunda operación XOR borra la imagen, (cancelando los cambios), se puede mover una imagen por toda la pantalla, haciendo que una operación XOR, la dibuje y borre rápidamente. MASCARAS DE BITS Al aplicar una operación AND a cualquier valor ASCII con el valor decimal 223, todas las letras en minúscula se ponen en mayúsculas sin que se modifiquen las letras mayúsculas. AND funciona comparando dos valores, (el ejemplo siguiente comparará un bit cada vez), y devolviendo un 1 solo cuando ambos valores son distintos de cero. Tabla AND 1 1 0 0 AND AND AND AND 1 0 1 0 = = = = 1 0 0 0 En notación binaria, 223 es 1101 1111, y este numero puede funcionar como una mascara de bits. Si se aplica una operación AND a cualquier numero binario de ocho dígitos o menos con esta mascara todo permanecerá en cada posición tal y como estaba, excepto el sexto dígito de la derecha, dejando también el 0 como estaba y cambiando los 1 por 0. A esto se le llama máscara porque enmascara cualquier cambio excepto el del lugar donde se desea que se produzca el cambio: el 0 de la posición 2^5. Puesto que A(65 decimal), es el valor binario 0100 0001, y a (97 decimal) es el valor binario 0110 0001, aplicar AND a estos números con (223 decimal) en binario 1101 1111, podría ser representado como: 0100 0001 (65) (A) AND 1101 1111 (223) (Mascara) 0110 0001 (97) (65) (A) à 0100 0001 (65) (A) (a) AND 1101 1111 à 0100 0001 (223) (Mascara) Si se aplica AND a un 0 o a un 1, con el valor 1 como mascara, deja en efecto el valor tal y como estaba, pero si lo aplicamos con el valor 0 como mascara, entonces, al 0 lo deja como 0 y al 1 lo convierte a 0.El numero binario 1101 1111 (223), hace que el bit 2^5, (el sexto por la derecha), se convierta en un 0,, y deja el valor del resto de bits, tal y como estaba. El cambio de un bit de o a 1 se conoce como activar el bit, y cambiarlo de 1 a 0 como desactivar el bit. Así pues la única diferencia entre una letra minúscula, y la letra correspondiente en mayúsculas, es que en la versión minúscula el sexto bit por la derecha,(2^5), está activado. Al aplicar AND con 1101 1111 el bit se desactiva convirtiéndolo en un 0, y reduciendo su valor ASCII en (32 decimal). Para invertir el proceso y convertir letras mayúsculas en minúsculas se emplea la operación lógica OR. Tabla OR 1 1 0 0 OR OR OR OR 1 0 1 0 = = = = 1 1 1 0 Si se aplica OR a un 0 o a un 1, con el valor 0 como mascara, el valor se queda como estaba, pero si lo aplicamos con el valor 1 como mascara, entonces los 1 se quedan como están y los 0 se convierten en 1. 0100 0001 (65) (A) 0010 0000 (32) (Mascara) 0110 0001 (97) OR (97) (a) à 0110 0001 (97) (a) (a) OR 0010 0000 à 0110 0001 (32) (Mascara) Al aplicar el 32 decimal como mascara, conseguimos activar el bit 2^5, (que en las mayúsculas esta desactivado, y por tanto sumamos 32 decimal al valor ASCII), y dejándolo como está en las minúsculas. MIREMOS LOS HEXADECIMALES A nadie le gusta trabajar con números binarios de ocho bits. Pero nuestro sistema decimal, con el que mas cómodos nos sentimos, no es apto para el mundo de los ordenadores de base dos. Sin embargo, un sistema numérico de base 16 si lo es, puesto que todos los números binarios de ocho bits pueden ser expresados como dos dígitos de base 16, o hexadecimales de forma conjunta. De hecho es mas fácil convertir números binarios en hexadecimal y convertirlos de nuevo a binario , que convertirlos en decimal y de nuevo a binario. La numeración hexadecimal funciona igual que el sistema numérico decimal, excepto que incluye seis dígitos mas. Los diez primeros dígitos son los mismos que los diez dígitos decimales que usamos normalmente. Pero los dígitos acaban al llegar al 9. Entonces, el sistema hexadecimal emplea las seis primeras letras del alfabeto. 0 (0) 1 (1) 2 (2) 3 (3) 4 (4) 5 (5) 6 (6) 7 (7) 8 (8) 9 (9) 10 (A) 11 (B) 12 (C) 13 (D) 14 (E) 15 (F) A los programadores les gusta a veces trabajar con números hexadecimales de dos dígitos, por lo que ponen ceros en el lado izquierdo, (0D, es lo mismo que D) El sistema hexadecimal hace además que las conversiones binarias sean muy sencillas. Por ejemplo, ¿cuál es el equivalente binario de FF?. Bien, esto es demasiado fácil, puesto que es igual a 255, y 255 es el numero mas alto que se puede formar en binario con 8 bits, (un byte), lo que significa que este numero debe estar compuesto todo de 1: 1111 1111 Tome cualquier otro numero hexadecimal: 0x3D, (61 decimal). Cada dígito hexadecimal contiene la mitad de un numero binario de ocho dígitos. Recuerda que un dígito binario es un bit y que 8 bits forman un byte, y que la mitad de un byte, (o sea 4 bits) se llama un nibble. (¿Lo entiendes?: ¿byte?, ¿nibble?) En el valor hexadecimal 0x3d, el 3 es el nibble de la izquierda o alto, y la D es el nibble de la derecha o bajo. En notación binaria, el 3 decimal es 0011, mientras que el 13, que es a lo que equivale la D hexadecimal es 1101. Esto ya lo vimos antes. Por tanto 3D hexadecimal es igual a 0011 1101. Pasar de binario a hexadecimal, también es fácil. ¿A que equivale 1010 0101? 1010 = 0xA = 10 à 0101 = 0x5 = 3 1010 0101 = 0x105 = 165 Así pues 1010 0101 es 0xA5 en hexadecimal, o 165 en decimal. Fíjate que los números 1 al 9 son lo mismo en decimal que en hexadecimal. La mayoría de la gente lo entiende enseguida, pero siempre acaba cometiendo el mismo error, que consiste en poner 10 después del nueve hexadecimal, cuando lo que se debe de poner es la letra A. No te preocupes, pronto te acostumbrarás. En realidad no es tan difícil convertir números hexadecimales de 2 dígitos en decimal. Primero convierte cada dígito a decimal. En el ejemplo anterior, A es igual a 10, y 5 es igual a 5. Multiplica por 16 el valor del dígito de la izquierda y sumale el dígito de la derecha: (10 x 16) + 5 = 165. Convertir un numero decimal igual o menor que 256 a hexadecimal solo es un poco mas difícil. Primero divide el numero entre 16. Probablemente no sea una división exacta y te encuentres con un cociente y un resto. Convierte el cociente a hexadecimal y después convierte el resto y colócalo a la derecha del cociente (ya convertido). Obtendrás así el hexadecimal buscado. 165/16 = 10 10 = A 5=5 A5 R=5 En el ejemplo anterior vemos como convertir el numero decimal 165 al hexadecimal A5. Como colofón de este documento, quisiera decirte que si tu eres un profesional que vas a trabajar frecuentemente con números binarios y/o hexadecimales, y mucho mas aun, si vas a realizar operaciones con ellos, procura tener siempre a mano, una calculadora semejante a la que incorpora Windows como accesorio, no te arrepentirás XDD. Oviedo, 6 de Marzo de 2000 Fdo: José Manuel Rodríguez Fernández uLZaNa