Objetivos
Material requerido
Paciencia y 20 minutos de sobra. |
El problema
En la sesión anterior presentamos un circuito con un Shift Register para gobernar 8 salidas digitales (o más) con solo 3 pines de Arduino y montamos un circuito de 8 LEDS y un primer programa en el que iterábamos un número de 0 a 255 y cada vez lo enviábamos a la salida del registro.
Vagamente dijimos que los LED irían contando en binario y mostrando esos valores en el circuito. Pero hasta ahora no hemos hablado en absoluto de que es el sistema binario o porque construimos ordenadores basados en él. ¿Es que nuestro viejo y familiar sistema decimal no es lo bastante bueno para los informáticos? ¿Se trata de una conspiración internacional para torturar a los estudiantes de informática, o para defender, los inconfesables intereses de las universidades de ciencias?
En mi experiencia, la gente que ha estudiado electrónica digital o informática, suele tener unas ideas más o menos claras de estos temas, pero el resto de universitarios y de gente más joven, rara vez tienen una comprensión mínima básica a pesar de que vivimos un mundo en el que a diario manejamos tecnología y términos informáticos sin tener un mínimo de comprensión de la base en que se apoya.
Como en estos tutoriales pretendemos no dar por supuesto ningún conocimiento previo, ha llegado el momento de introducir algunos conceptos e ideas básicas sobre tecnología digital.
Somos muy conscientes de la desbandada que semejante pretensión puede producir entre los esforzados seguidores de estos tutoriales, así que vamos a prometerles en primer lugar, que trataremos de hacerlo fácil y hasta agradable y en segundo lugar que merece la pena, porque no se puede entender la tecnología moderna sin unas nociones mínimas de sus fundamentos lógicos.
El sistema decimal
Estamos tan acostumbrados al sistema decimal, que cualquier idea de que se pueda usar otro, al principio suena absurdo o hasta malintencionado. Y sin embargo este es solo uno más entre un ilimitado número de posibilidades.
Desde pequeños, los colegios nos han entrenado en su uso y al final lo tenemos tan interiorizado que sencillamente, hemos incluso olvidado las reglas básicas que aplicamos, simplemente lo hacemos y ya está.
Vamos atener que recordar esas reglas. La primera es que se llama sistema decimal porque utilizamos diez dígitos, del 0 al 9 (No señor, no usamos del 1 al 10). ¿Por qué?
Pues, probablemente, porque tenemos 10 dedos en las manos, y recordemos que las manos fueron la primera calculadora. De hecho a la representación simbólica de un numero la llamamos digito que viene del latín digitus (dedo), (y por eso tendemos a pensar que usamos del 1 al 10…dedos), porque, aunque hemos asumido el sistema de numeración que nos enseñaron de niños, no es fácil comprender el salto conceptual que significa representar nada con un 0. Y esta es la clave.
Los antiguos griegos y romanos, por ejemplo, tenían un sistema de numeración que funcionaba malamente, y que era demencial porque no era posicional sino simbólico, y además no incluía ni la noción ni la notación del 0. Sumar ya era complicado pero multiplicar o dividir era casi imposible.
Hizo falta que surgiera un matemático indio, allá por el siglo 3, que comprendió el concepto del 0 y su importancia como digito, y estableció el primer sistema de numeración moderno.
Desde allí pasaron a los árabes, grandes comerciantes, que enseguida comprendieron la ventaja de esta numeración para sus negocios( Pues cuando hay por el medio piastras o euros el ingenio se agudiza mucho), y a través de los árabes llegaron a occidente en épocas muy posteriores y con la notación actual que nos es familiar. Por eso quizás hayáis oído decir que en occidente usamos los números arábigos.
¿Qué reglas aplicamos para contar? (Lo domináis, lo sé, pero recordemos el procedimiento). Pues solamente dos:
- Primera: usamos los números en orden creciente 0, 1, 2,3,….9 y cuando se nos acaban los dígitos de base volvemos a 0 e incrementamos en 1 el digito a la izquierda, aplicando la misma regla.
- Segunda: Si no hay ningún digito a la izquierda entendemos que es un cero y aplicamos la regla primera para incrementarlo.
Así pues, el siguiente al 9 va a ser un 0 a la derecha (ya que el siguiente al 9 es 0) y a la izquierda como no hay nada lo consideramos un 0 que al incrementarlo deviene en un 1, o sea el 10. Lo siguientes números son fáciles:
11, 12,13,….. 19
El siguiente a 19 se obtiene de volver a cero la posición del 9 y aplicar la regla al 1 à 2
20, 21,22…..29 …………… 90, 91,92…..99
¿Qué ocurre ahora? Pues lo mismo. Aplicamos la regla primera al 9 de la derecha, 9 à 0, e incrementamos el 9 a su derecha, 9 à 0 y aplicamos la regla al inexistente cero a la izquierda que deviene en 0 à 1. Por tanto el siguiente número es el 100. Este es un procedimiento para crear números ilimitadamente grandes y que simplifica enormemente el cálculo.
Pero la elección de 10 dígitos como sistema de numeración es una decisión arbitraria (que por cierto no ha sido la única en la historia de la humanidad) y no está justificada por ninguna razón lógica. Es simplemente una costumbre.
Y como los matemáticos son gente que odia las cosas sencillas, a la que les gusta complicarse la vida y amargárnosla a los demás, empezaron a hacerse preguntas del tipo ¿Existe algún límite, superior o inferior en el número de dígitos de un sistema de numeración? ¿Son equivalentes? ¿Se puede traducir de un sistema de numeración a otro? Y aquí es donde se abrieron las puertas del infierno (o del paraíso digital, según se mire).
El sistema binario
El sistema más sencillo de numeración que podemos organizar se llama binario y contiene solo dos dígitos: 0 y 1. Con este sistema se puede escribir cualquier número por ilimitadamente grande que sea y se puede además contar, calcular y hacer cualquier cosa que se pueda hacer es el sistema decimal, sin excepción.
¿Cómo contamos con un sistema tan raro? Pues en realidad, aplicando exactamente las mismas reglas que con el decimal, pero limitados a dos únicos dígitos:
Al cero le sigue el 1, y el siguiente al 1 es 0, y aplicábamos la regla al inexistente 0 a la izquierda
Así que los primeros números contados en binario serian:
0 - 0 1 - 1 10 - 2 11 - 3 100 - 4 101 - 5 110 - 6 111 - 7 1000 - 8
La notación binaria hace que la representación sea mucho más larga ¿y qué?, pero no tiene otro inconveniente. Además las reglas para sumar y multiplicar harían las delicias de los escolares.
Para sumar solo hay: | Las tablas de multiplicar son: |
---|---|
0 + 0 = 0
0 + 1 = 1 1 + 0 = 1 1 + 1 = 0 y me llevo una. |
0 * 0 = 0
0 * 1 = 0 1 * 0 = 0 1 * 1 = 1 |
Y ahora viene la cuestión clave, ¿Por qué usar el sistema binario en los ordenadores en lugar del familiar sistema decimal?
Pues sencillamente por una cuestión e tecnología: No disponemos de ningún material que presente 10 estados diferenciados estables que podamos utilizar como fundamento para la construcción de ordenadores decimales.
Pero sin embargo, si disponemos de materiales (los semiconductores) que presentan dos estados estables fácilmente diferenciables, los semiconductores nos permiten construir transistores que mediante una señal de control en la Base, permiten la conducción entre emisor y colector( cuando funciona en saturación) o la corta por completo ( cuando funciona al corte).Y es esto lo que reconocemos como 0 y 1.
O lo que es lo mismo con un 1 en la base (HIGH o 5V) podemos leer la tensión de salida como un 1 o HIGH. Y para un LOW en la base leeremos un LOW en la salida del transistor. Construimos computadores binarios porque disponemos de una tecnología estable que se presta a ello.
¿Es el sistema binario superior, o mejor que el decimal, en cualquier aspecto retorcido de la teoría de algo? Para nada, son completamente equivalentes.
¿De disponer de una tecnología con 10 estados estables, que nos permitiera construir ordenadores basados en el sistema decimal, seguiríamos usando el sistema binario? Ni hablar, y el binario se relegaría a las escuelas de historia solamente (y a los matemáticos claro).
Aunque IBM ya construía computadoras e los años 40 del siglo 20, eran caras y problemáticas porque se construían a base de válvulas termoiónicas de vacío ( las famosas lámparas, o válvulas de la radio de la abuela). Fue con el advenimiento del transistor en 1947 (que supuso el Nobel de física para sus descubridores) que empezó la carrera tecnológica actual.
Al principio los transistores se fabricaban de uno en uno, pero la gente (que no es tonta), en seguida se dio cuenta de que podía fabricar varios transistores en una oblea de silicio, interconectados entre sí, además de todos los componentes necesarios para integrar un circuito electrónico en un único chip.
Y aquí empezó una carrera por ir metiendo más transistores y más componentes en un chip. Montar las fábricas es caro pero lo que fabricas es casi gratis. (El Silicio sale de la arena de playa) así que cuanto más componentes integras, más cosas hace el circuito y más caro se puede vender.
A finales de 2014, el circuito comercial que más transistores integra es un procesador de Intel con alrededor de 4.300.000.000 transistores (Si, está bien, Unos cuatro mil trescientos millones).
Y para cerrar este capítulo mencionaremos que la famosa ley de Moore dice que el número de transistores que somos capaces de integrar en un chip se dobla cada dos años (más o menos) y que se ha cumplido bastante fielmente en los últimos 50 años, aunque parece haber dudas de que esto vaya a seguir siendo así.
Otros sistemas de numeración
Si alguien pensaba que una vez establecido el sistema binario además del decimal, los matemáticos nos iban a dejar en paz de una vez, se ve que es nuevo y no conoce a esa gente.
En computación se utiliza también la notación octal y la hexadecimal. En los que respectivamente se utilizan 8 dígitos (del 0 al 7) y 16 respectivamente.
Un momento ¿16? ¡ Si no hay tantos números ! ¡Pues se inventan los que haga falta!
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
- Os acordáis de que cuando vimos la sesión del keypad matricial, contenía todos esos símbolos? ¿Creíais que era casualidad?
- Vuestro humilde Duino, soporta todos estas notaciones de números, y ya buscaremos algun ejemplo para ilustrarlo.
¿Porque usar otro par de sistemas de numeración tan extraños? Porque son potencias de 2, 23 y 24, y son especialmente fáciles de pasar de uno al otro, especialmente al hexadecimal
Ignoraremos el octal, porque se usa más bien poco, pero el hexadecimal, sí que se usa bastante. Para entender porque, tenemos que dar un rodeo.
En el sistema decimal, a llamamos dígitos a cada uno de los símbolos que representan los números de la base aunque su nombre correcto sería digito decimal.
En el sistema binario llamamos dígitos binarios a cada uno de sus símbolos 0 y 1, en inglés se dice BInary digiT, o sea bit, una de las palabras mágicas de la informática.
En el sistema decimal, de un numero como 4.327 decimos que tiene cuatro dígitos y en el sistema binario de algo como 1100 0101 decimos que es de 8 dígitos, o sea de 8 bits.
En el mundo real, además de los diez dígitos usamos veintitantas letras mayúsculas y otras tantas minúsculas, adema de símbolos especiales como +, -, *, /, € ….
Pero con la tecnología digital, sencillamente no hay más numero posibles,¿ Así que, como representamos todo este caos? Pues solo hay una solución: Creando un código de representación de caracteres, de forma que cada símbolo se represente por una combinación de bits en una tabla.
Algo que ya habíamos visto cuando hablamos en la sesión 7 del código ASCII. Lo que no dijimos allí es que para poder representar todos los caracteres del alfabeto occidental (y reservar alguno para sorpresas como el €) necesitamos utilizar paquetes de 8 bits porque con ello podemos codificar 28 = 256 caracteres.
Parecía que había que bautizar a los paquetes de 8 bits. Alguien dijo Byte, y mira, hasta hoy.
Así que un bit es un simple digito binario y la información que puede codificar es 0 o 1. Es difícil codificar un elemento de información más pequeño.
- Si alguien piensa que solo con el 1, sería menor, se olvida de que no hay manera de librarse del 0 y con un solo dígito, todos los números serian iguales, piénsalo, habríamos vuelto a las cavernas, poniendo un palito por cada bisonte.
Un paquete de 8 bits, que puede llevar información de texto codificada se llama byte. Pero con la tecnología moderna la capacidad de las memorias ha crecido tanto que necesitamos unidades mayores así que tiramos del griego:
Prefijo | Valor decimal | Valor en binario | |
---|---|---|---|
Kilo | 103 | Mil | 210 = 1.024 |
Mega | 106 | Millón | 220 = 1.048.576 |
Giga | 109 | Mil Millones | 230 = |
Tera | 1012 | Billón europeo | 240 = |
Peta | 1015 | 250 | |
Exa | 1018 | 260 | |
Zetta | 1021 | 270 |
¿A que no os sabíais estos últimos?
Los prefijos decimales son las potencias de la base 10, pero por aprovechamiento, en un sistema binario conviene usar las potencias de 2 y aprovecharnos de lo redonda que queda la numeración, pero recordando que la Mega en binario son 1024×1024 aunque luego nadie recordemos cuanto exactamente.
Ahora si podemos entender porque el sistema hexadecimal es útil en informática. Un carácter se codifica con 8 bits y un número hexadecimal representa 4 bits exactamente por lo que cualquier paquete de 8 bits se traduce en dos dígitos hexadecimales. La conversión es automática y el empaquetado más conciso:
Símbolo | Decimal | Binario | Hexadecimal |
---|---|---|---|
A | 65 | 0100 0001 | 41 |
B | 66 | 0100 0010 | 42 |
C | 67 | 0100 0011 | 43 |
D | 68 | 0100 0100 | 44 |
Fíjate en la numeración e las primeras letras ( en ASCII). El binario corresponde a sus 8 bits y en hexadecimal solo dos. Convertir de binario a ex consiste en tomar los números de 4 en 4 y asignar el valor hex equivalente, para la D son dos cuatros.
- Creo que ya hemos abusado bastante de la buena voluntad de nuestros resignados lectores y por tanto, evitaré entrar en cómo se pasa un número de un sistema a otro.
Todos los lenguajes de programación incluyen notación para introducir número binarios, decimales, octales y hexadecimales y C++ no es la excepción. En las próximas sesiones tendremos ocasión de verlo ( No, no es una amenaza).
Resumen de la sesión
Hoy hemos aprendido en nuestro curso arduino lo siguiente: