Back to basics #2 - Convirtiendo decimal a otras bases.

Hola de nuevo a todos, el día de hoy vamos ver cómo convertir números de decimal a las bases más comunes.

Antes de empezar, cuales son las bases más comunes? Las bases más comunes son: binario, octal, decimal y hexadecimal.
Prácticamente todas las conversiones se hacen mediante divisiones sucesivas entre el número base. por ejemplo vamos a convertir el número 7956 decimal a octal.

Para empezar dividiremos entre 8, pero solo haremos una división entera. Al hacerla obtenemos el número 994, ademas hacemos la operación MOD (obtenemos el residuo de la división) y obtenemos 4, este numero lo guardamos a parte. Al resultado de la división entera lo vamos a dividir nuevamente; es decir, a 994 los dividimos entre 8 y además hacemos la operación MOD, las divisiones se repetirán mientras el número de resultante de la división previa sea mayor que la base a la cual queremos convertir. Entonces tenemos algo cómo lo que sigue:

  • 7956/8 = 994; 7956 mod 8 = 4.
  • 994/8 = 124; 994 mod 8 = 2.
  • 124/8 = 15; 124 mod 8 = 4.
  • 15/8 = 1; 15 mod 8 = 7.

Cuando llegamos a la ultima division, solo nos resta organizar los números, para hacerlo, vamos a tomar el resultado de la ÚLTIMA y solo de la última y lo pondremos cómo el primer dígito del resultado, en este caso el numero es 1, luego tomaremos el residuo (o resultado de la operación mod) y los escribiremos a continuación, entonces tenemos 17, luego solo anotaremos los residuos en orden de penúltimo a primero, y tendremos 17424. Con las operaciones anteriores tenemos que el número 7956 en base decimal, es igual a 17424 en base octal.

Para convertir un numero a base hexadecimal repetiremos los pasos anteriores solo que en está ocasión dividiremos entre 16.

  • 7956/16 = 497; 7956 mod 16 = 4.
  • 497/16 = 31; 497 mod 16 = 1.
  • 31/16 = 1; 31 mod 16 = 15.
  • Acomodando tenemos 1F14.
Y ahora que sabemos el proceso, podemos convertir a cualquier base, por ejemplo a base 3. solo tenemos que repetir los pasos anteriores. Tomando cómo ejemplo el mismo número tenemos:

  • 7956/3 = 2652; 7956 mod 3 = 0
  • 2652/3 =  884; 2652 mod 3 = 0
  • 884/3 = 294; 884 mod 3 = 2
  • 294/3 = 98; 294 mod 3 = 0
  • 98/3 = 32; 98 mod 3 = 2
  • 32/3 = 10; 32 mod 3 = 2
  • 10/3 = 3; 10 mod 3 = 1
  • 3/3 = 1; 3 mod 3 = 0.
  • Acomodando tenemos 101220200.


La semana que viene vamos a hacer una calculadora para convertir de decimal a cualquier base (hasta 20).Por ahora es todo, los leo luego.

Back To basics #1 - Convirtiendo números en diferentes bases a decimal..

Hola de nuevo a todos el día de hoy vamos a ver un tema un tanto sencillo.

Hace algunos días, mientras navegaba por un foro de programación, me encontré con alguien que mostraba cómo hacer la conversión de un numero hexadecimal a decimal, al entrar todo estaba bien, o al menos eso era en apariencia, ya que al momento de explicar cual era el sentido de hacer la conversión no supo que decir (aun teniendo el internet a la mano), entonces una lluvia de criticas le cayeron. El único argumento que pudo dar en su defensa fue: "Pues háganlo ustedes". Y bueno aquí vamos.

Por qué usar una base diferente a 10?

En compactan hay que recordar que internamente se usan solo dos números: el 1 y el 0, que son la cantidad mínima representable (encendido o apagado). Para trabajar en la computadora se usan Bytes y cada Byte esta compuesto de ocho bits, entonces el numero máximo que se puede representar usando ocho bits es 11111111 (hay que tener algunas consideraciones con respecto a como se interpretan los datos en una computadora, pero por ahora solo convertiremos ese numero en "crudo").
La computadora entenderá perfectamente esos numero, pero que pasa si un humano quiere saber cual es el numero que representa 10010001? Para eso es necesario convertirlo a una base con la que ya estemos familiarizados.
Los números se pueden representar en cualquier base a partir de 2, puede ser base 3, base 5, incluso base 20. La base con la que estamos familiarizados es la base 10, pero antes de seguir, de seguro te preguntas: que es una base? Bien, la explicación mas sencilla es, la cantidad de números disponibles para representar un valor mas grande. Por ejemplo, en un numero de base dos, solo se dispone de los números 0 y 1. En un numero de base diez, se disponen de los números 1,2,3,4,5,6,7,9,0. Para representar un número más grande que diez, se empiezan a usar las potencias de diez y para el caso de la base dos, para representar un numero más grande que dos se usaran potencias de dos.

Para continuar con el meollo del asunto, ahora sabemos que ocho bits pueden representar el numero 11111111 en base dos, para convertirlo, solo vamos a multiplicar el valor de cada numero por su potencia correspondiente empezando de izquierda hacia la derecha y se empezara por la base elevada a la potencia cero.
2^7 (128)2^6 (64)2^5 (32)2^4 (16)2^3 (8)2^2 (4)2^1 (2)2^0 (1)
11111111
Mirando la tabla anterior tenemos que el valor de 11111111 en base dos es igual a la suma de 2^0 hasta 2^7, haciendo la cuenta esto resulta en 255 decimal. Para convertir el numero 10010001 de base dos a base 10, debemos de hacer lo mismo que hicimos antes, debemos de multiplicar el valor del dígito por si potencia y tendriamos algo cómo lo que sigue:
2^7 (128)2^6 (64)2^5 (32)2^4 (16)2^3 (8)2^2 (4)2^1 (2)2^0 (1)
10010001
Al hacer las sumas obtenemos que el número 10010001 de base dos es igual a 145 en base 10.

Y ahora la pregunta del millon, por que usar la base 16? La base 16 es muy comun usarla para representar los numero en computacion, si recuerdas los post: "Cómo extraer una imagen embebida en un mp3", usabamos un visor hexadecimal para ver la informacion dentro del mp3.
Esto es así debido a que el número 11111111 (255) es equivalente a FF en hexadecimal. Antes de seguir hay que saber esto. Para evita confusiones, cuando usamos una base que tiene digitos más alla de nuestro 9, debemos de usar símbolos, asi evitamos confundir números, en el caso del hexadecimal, se deben de usar 16 caracteres para representar, entonces empezamos desde el 0 hasta la F, despues del 9 seguiría el 10, para evitar confusiones usamos la letra A(10), B(11), C(12), D(13), E(14) y F(15).
Al igual que con la base dos, se usaran potencias, pero en este caso serán potencia del número 16
16^1 (16)16^0 (1)
FF

entonces para representar el el numero 11111111 solo debemos de usar dos dígitos en base 16, basta con usar FF para representar cada valor posible de un byte. para valores hexadecimales más grandes, bastará con usar la siguientes potencias.
Y bien, por ahora es todo, en el siguiente post vamos a hacer el proceso inverso y más adelante una aplicación para android que convierta entre cualquier base.

Los leo luego.

Vamos a programar #34 - Depurando código de javascript.

Hola de nuevo a todos, el día de hoy vamos a ver una parte esencial para cualquier persona que se dedica a programar.

Cuando se crea un código nuevo, este siempre estará propenso a errores, está más que garantizado, que sin importar que tanto tiempo lleves en la programación, siempre surgirán errores. Algunos de ellos serán tan simples cómo: "olvide una coma", otros no tan obvios y solo surgirán al momento que se ejecute el código.
Para estos caso, en la mayoría de entornos de desarrollo siempre dispondremos de una herramienta que se encargara de dejarnos ver que es lo que está pasando en determinado punto del programa.

Suponiendo que queremos ver que está pasando en determinado punto del programa, en javascript; existe la palabra reservada "debugger", cuando la ejecución del programa se encuentra con esa palabra, la ejecución se detendrá y mostrará en la consola los datos correspondientes a las variables.

Para que la ejecución del depurador ocurra, el modo desarrollado debe de estar activado, para hacerlo en Google Chrome, basta con oprimir la tecla F12 (y se abrirá un ventana incrustada cómo en la primer imagen). En lo personal, prefiero usar Firefox, para acceder al modo desarrollador, basta con hacer clic en menú>Desarrollador > Depurador. Para el caso de Opera, debes de hacer clic en menú>Desarrollador>Herramientas de desarrollo.

En la siguiente imagen se muestra las partes importantes de la ventana de depuración:

El area con un recuadro rojo (1), son los controles que no servirán para controlar el flujo del código, existen cuatro botones y cada uno hace en orden de aparición lo siguiente:

  • Continua con el flujo normal del programa; es decir: ejecuta el programa hasta salir de la función o parte de código en la cual se invocó el depurador.
  • Las siguientes sirven para avanzar de "uno por uno", cada vez que se oprima, el programa avanzará una linea en el programa, si al momento de hacerlo se encuentra con la llamada a una función, el cursor se desplazará hasta ella y continuará la ejecución en la parte donde empieza, si se continua, avanzará sobre las lineas de la función y cuando acabe, volverá a donde se encontraba pero avanzando a la siguiente linea después de la ejecución de la función. Ademas al hacer esto, en la parte enmarcada en verde (2) todas las variables que se creen o cambien se mostraran ahí.
  • El último botón ejecutara hasta el final del bloque de código y al igual que el anterior, si hay cambios en las variables, se mostrarán en el panel Variables.
Todo esto sirve para revisar paso a paso lo que sucede en cada variable al momento de que se realiza la ejecución. Supongamos que un días llegas ebrio y decides agregar unas cuantas lineas de código, cuando recuperes tu sobriedad, probablemente puedas identificar la mayor parte del código que agregaste, pero si por alguna razón, una linea pasa desapercibida; pueden ocurrir muchos dolores de cabeza (y no lo digo cómo anécdota).

Cuando los errores se detectan, que es lo que se debe de hacer? usualmente los errores que se encuentren, se mostraran en un apartado llamado "consola web"


Por cada error habrá una pequeña descripción acerca de este, en el caso de la imagen, Nos dice que hay un error en la linea 183; nos dice que al tratar de obtener un elemento por su ID, este nos devolvió "NULL", eso puede significar que el objeto que estamos tratando de obtener no existe, pero Nosotros sabemos que si está, al revisar la linea vemos que el código es: "document.getElementById('ResulT').value = Salida;", al revisar los objetos que creamos en el formulario vemos que no hay ningun elemento que tenga esa ID y el mas cercano es "Result". Entonces eso significa que cometimos un error al escribir el ID del objeto que queríamos y en su lugar, mandamos a llamar a otro que no existe. Al cambiar el ID por el correcto, el error desaparece.

Con esas herramientas resultará mas sencilla la tarea de eliminar bug's de nuestro código.
Por el momento es todo, en próximos post, veremos cómo es el proceso de depuración en otras plataformas.

Los leo luego.