Mostrando las entradas con la etiqueta Basics. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Basics. Mostrar todas las entradas
Back to basics #9 - Compuertas lógicas
Hola de nuevo a todos, el día de hoy vamos a ver un poco sobre la lógica.
Cómo muchos de ustedes sabrán, la unidad básica de numeración es el binario; es decir que solo hay dos dígitos disponibles para representar a los demás. Al solo disponer de unos y ceros, la cosa es un tanto "simple".
Electrónicamente hay ciertos circuitos que son capaces de hacer operaciones sobre los "unos" y "ceros" y dependiendo del tipo de operación para el cual fue diseñado el circuito nos devolverá un valor, a estos circuitos se les denomina "compuerta lógica". Existen siete tipos de compuertas (básicos son cuatro) y cada una funciona diferente. Ahora veamos cuales son.
Cómo muchos de ustedes sabrán, la unidad básica de numeración es el binario; es decir que solo hay dos dígitos disponibles para representar a los demás. Al solo disponer de unos y ceros, la cosa es un tanto "simple".
Electrónicamente hay ciertos circuitos que son capaces de hacer operaciones sobre los "unos" y "ceros" y dependiendo del tipo de operación para el cual fue diseñado el circuito nos devolverá un valor, a estos circuitos se les denomina "compuerta lógica". Existen siete tipos de compuertas (básicos son cuatro) y cada una funciona diferente. Ahora veamos cuales son.
AND
La compuerta AND (Y en español) es una compuerta lógica que recibe dos entradas y tiene una salida. Su símbolo es el siguiente:
Tenemos que la compuerta AND tiene las entradas "A" y "B" pero además posee una salida "C". Antes de continuar imaginemos que cada que vemos un uno, significa hay un voltaje y para fines prácticos serán 5v, por lo que para la compuerta AND, si tenemos un cero a la entrada "A" y un cero a la entrada "B", la salida "C", tendrá un cero. Una forma fácil de recordar cómo es que funciona la compuerta AND es tomar un enunciado cómo ejemplo. "Ve a la farmacia a traer Alcohol y paracetamol., Solo si hay alcohol Y paracetamol traes banditas, si no no traigas nada." Esto significa que solo cuando las primeras condiciones se cumplen, la tercera también lo hará, es decir solo si hay dos unos a la entrada, también habrá un uno a la salida, retomado el ejemplo, Sí hay alcohol y no hay paracetamol, entonces no se compran las banditas, sí hay banditas pero no hay alcohol de igual manera las banditas no se compran. Sí no hay alcohol y tampoco hay paracetamol las banditas no se compran.
Or
La compuerta OR (O en español) es una compuerta lógica que recibe dos entradas y tiene una salida. Su símbolo es el siguiente:
La compuerta OR tine las entradas "A" y "B" y una salida "C". Para entender un poco cómo funciona, tomemos el siguiente enunciado: "Ve a la tienda y sí hay vino O jugo compras vasos". Para evaluar el resultado es importante notar que si una de las entradas está encendida, la salida también lo estará. Si retomamos el ejemplo, sí hay vino, se compran los vasos aun si no hay jugo. Sí hay jugo de igual forma se compran los vasos aun si no hay vino. Sí hay vino y jugo, se compran los vasos de igual forma. Solo cuando no hay vino y jugo, no se compran los vasos. Para la compuerta lógica OR es lo mismo, solo cuando las dos entradas son ceros (o están apagadas) la salida también lo estará. Para los otros casos la salida tendrá un uno (o estará encendida).
Xor
La compuerta XOR (O exclusivo en español) es una compuerta lógica que recibe dos entradas y tiene una salida. Su símbolo es el siguiente:
La compuerta XOR tiene las entradas "A" y "B" y una salida "C". Esta compuerta solo tendrá un uno la salida cuando "A" o "B" tengan también un uno, pero ojo solamente cuando una o la otra pero no ambas, Si ambas entradas son unos o ambas entradas son ceros, la salida será cero.
Not
La compuerta Not (No en español pero en realidad significa el inverso) es una compuerta lógica que recibe una entrada. Su símbolo es el siguiente:
La compuerta NOT solo posee una entrada "A" y una salida "B". Cómo no se me ocurre una buena metáfora, solo digamos que sirve para invertir lo que se aplique a la entrada "A", es decir sí la entrada es un cero (apagado), la salida será un uno (encendido) y viceversa.
NAND, NOR y XNOR
Para las compuertas NAND, NOR y XNOR las entradas son las mismas que sus contra partes.
La única diferencia es que estás funcionan al revés, si en la compuerta AND esperamos un cero a la salida, en la compuerta NAND esperaríamos un uno (Obviamente ingresando las mismas entradas). Seguramente te diste cuenta que es lo mismo usar una compuerta NAND que usar una AND y una NOT juntas y de hecho es posible obtener el mismo resultado de una usando otras.
Y bien, por ahora es todo. En el siguiente post veremos cómo "simular" las compuertas usando programación y después veremos cómo usar los circuitos para prender LED's.
Los leo luego.
4/12/2020 04:32:00 p.m.
aprende
,
Basics
,
Compuertas
Back to basics #8 - Más operaciones binarias.
Hola de nuevo a todos. El día de hoy vamos a continuar con más de las operaciones básicas pero usando la base dos.
En el post anterior vimos cómo es que la suma es idéntica a la suma del sistema decimal, por lo que ahora veremos la multiplicación y la división.
Los leo luego.
En el post anterior vimos cómo es que la suma es idéntica a la suma del sistema decimal, por lo que ahora veremos la multiplicación y la división.
División.
La división es simple, ya que al haber solo dos posibilidades, se reduce a cabe o no cabe. Pero antes veamos cómo ejemplo la división del número 164 (decimal) entre 5 (también decimal).
Cómo podemos observar, se separa tantas veces cómo sea necesario hasta que el número entre el cual queremos dividir "quepa", cómo no se puede dividir uno entre cinco (de manera entera), tomamos el siguiente dígito y formamos el número 16, lo dividimos entre 5 y nos da 3 y lo anotamos arriba, luego se hace la multiplicación y nos da 15, este número lo debemos de restar de los números de los cuales dividimos y tenemos : 16 - 15 y nos resulta uno. Anotamos este número y "bajamos" el siguiente, y nuevamente probamos si el numero resultante (14 en este caso) es divisible entre cinco, simplemente dividimos, pero si no fuera el caso "bajaríamos" el siguiente número hasta que se pudiera dividir. En el ejemplo anterior, al "bajar" el cuatro, nos resulta 14 por lo que lo dividimos entre cinco y nos resulta dos, este número lo anotamos "hasta arriba" y hacemos la multiplicación, dos por cinco es diez, lo anotamos y restamos nuevamente y nos resulta cuatro. Cómo ya no hay mas número para dividir, tenemos que 164 dividido entre cinco es 32 y nos sobran cuatro.
Para el caso de la división binaria, tomemos los mismos números, 164 que es igual a 10100100 y cinco que es igual a 101.
Repetimos los pasos, 1 entre 101 es cero, tomamos el siguiente dígito, 10 entre 101 es cero, tomamos el siguiente dígito 101 entre 101 es uno, lo anotamos y multiplicamos, 101 * 1 = 101, hacemos la resta y tenemos que nos sobra 0. Repetimos lo mismo, pero ahora a cada que bajemos un número y si no cabe, anotaremos un cero en la parte de arriba, si observamos bien, después de la resta, tenemos que se forman los números 0 , 00, 001, 0010, 00100 pero cómo en ninguno de los anteriores cabia 101, se iba anotando un cero en la parte de arriba, todo lo repetimos hasta que se acaben los números y entonces tenemos que 10100100 entre 101 nos da 100000 y nos restan 100 que es exactamente lo mismo que su versión decimal.
Multiplicación.
Para realizar la multiplicación, tomemos cómo ejemplo la multiplicación del número diez por el número tres. Tenemos algo asi.
Para hacer la multiplicación, simplemente multiplicamos el primer dígito por cada uno de los dígitos del otro número, y anotamos cada resultado, cuando acabemos con el primer dígito, pasaremos al segundo y al resultado de cada multiplicación, lo "moveremos" a la izquierda, de tal forma que la decenas estén alineadas con las decenas y centenas con centenas. Cuando se han multiplicado todo los dígitos, solamente restará sumar los resultados, si observas en la multiplicación anterior, el espacio vació es equivalente a cero, por lo que se sumara cero mas tres, uno mas cero, cero mas seis y dos mas cero. al anotar los resultados tenemos que 201 x 13 es igual a 2613.
Para usar números binarios, haremos exactamente lo mismo, para seguir con el ejemplo anterior, tenemos que 201 en base decimal es igual a 11001001 en binario y 13 en base decimal es 1101 en binario. Acomodamos lo números al igual que ejemplo anterior y tenemos.
La multiplicación de cada dígito es realmente sencilla, ya que al solo haber unos y ceros, si es cero, por cada dígito se anotara un cero; si es uno, simplemente anotaremos el mismo dígito (porque uno por uno es igual a uno y cero por cero es igual a cero). Simplemente repetimos los pasos y seguimos los pasos para hacer la suma (lo que vimos en el post anterior) y tenemos que 11001001 por 1101 nos da 101000110101 que es igual a 2613 (recuerda que tenemos una app en android para convertir número a distintas bases o la versión web para que pruebes los valores y cerciores que estamos bien).
Y bien, por ahora es todo, cómo podrás haber observado las operaciones con números binarios son realmente sencillas y si sabes multiplicar y sumar, entonces también lo puedes hacer el sistema de numeración binario.
Y bien, por ahora es todo, cómo podrás haber observado las operaciones con números binarios son realmente sencillas y si sabes multiplicar y sumar, entonces también lo puedes hacer el sistema de numeración binario.
Los leo luego.
Back to basics #7 - Suma binaria.
Hola de nuevo a todos , el día de hoy vamos a continuar con mas de lo básico. En esta ocasión veremos cómo se hacen las cuatro operaciones básicas utilizando el sistema de numeración binario. Cómo ya hemos visto cómo es que funcionan los diferentes sistemas de numeración, en este momento llego la hora de ver las operaciones básicas: suma, resta, multiplicación y división. Si ya sabes hacer estás operaciones con el sistema de numeración decimal (base 10) entonces ya tienes dos pasos para poder hacer las mismas operaciones en otras bases.
Para empezar, veamos cómo hacemos una suma normalmente. Imaginemos que tenemos el número 293 y queremos sumarle el número 281
La operación es simple, a tres se le suma el uno, a nueve se le suma ocho; pero cómo el resultado es mayor a la base (base 10), "llevamos una" y la sumamos a la siguiente suma que es dos mas dos. Cómo podrás observar, el resultado es 574, simple!.
Ahora tomemos el mismo ejemplo, pero en base dos. Para eso, primero convertimos el número decimal 293 a binario, y tenemos que es igual a: 100100101. Hacemos lo mismo con el número 281, y tendremos que es igual a 100011001. Para sumarlos, bastará con alinearlos empezando por el lado izquierdo.
Ahora simplemente sumamos los número cómo lo haríamos de manera normal, pero en este caso hay que tener siempre en cuenta que cuando pasemos de nuestro número base, debemos de hacer lo mismo que hacemos cuando usamos la base decimal; es decir "llevar uno" y hacer la suma normal.
Ahora probemos con otro número:
Sumamos, 0 + 0 = 0, 1 + 1 = 10, anotamos el cero y "llevamos uno", 1 + 1 = 10 + 1 (que llevábamos del anterior) = 11, anotamos el uno y otra vez llevamos el 1, 0 mas el uno que llevábamos = 1 y finalmente anotamos el uno.
Pero que pasa si sumamos mas de dos numero a la vez, supongamos que queremos sumar los números: 110, 111, 1010 y 1111
Empezamos de izquierda a derecha y tenemos: 0+1+1+1 = 11, anotamos el uno y llevamos una. 1+1+1+1 = 100 + 1 = 101, pero que pasa en estos casos? para poder realizar la suma siguiendo el mismo método, podemos sumar por pares a los números uno; es decir, en lugar de sumar 1+1+1+1+1, separamos a 1+1 , 1+1 y 0+1 (si no hay otro número uno ponemos un cero), y si en cada par el resultado es 10, simplemente llevamos un uno, en la imagen puedes ver que llevamos dos unos y tiene sentido, pues tenemos que 1+1 = 10, 1+1 = 10 y 0+1 = 1. Cómo se agrupan por pares y al sumar 1 + 1 siempre nos da 10, si hay un número que no tenga pareja, anotamos el uno en el resultado. Repetimos el procedimiento hasta llegar al extremo derecho, si ya no hay número en la suma original, pero aun nos "sobran unos", debemos de seguir sumado hasta que ya no haya mas.
Y bien, cómo podrás ver, la suma es realmente sencilla, mucho del procedimiento que usamos en las operaciones de base 10, lo podemos emplear en base 2, por lo que en el siguiente post, veremos cómo se hacen las otras tres operaciones básicas.
Los leo luego.
Para empezar, veamos cómo hacemos una suma normalmente. Imaginemos que tenemos el número 293 y queremos sumarle el número 281
La operación es simple, a tres se le suma el uno, a nueve se le suma ocho; pero cómo el resultado es mayor a la base (base 10), "llevamos una" y la sumamos a la siguiente suma que es dos mas dos. Cómo podrás observar, el resultado es 574, simple!.
Ahora tomemos el mismo ejemplo, pero en base dos. Para eso, primero convertimos el número decimal 293 a binario, y tenemos que es igual a: 100100101. Hacemos lo mismo con el número 281, y tendremos que es igual a 100011001. Para sumarlos, bastará con alinearlos empezando por el lado izquierdo.
Ahora simplemente sumamos los número cómo lo haríamos de manera normal, pero en este caso hay que tener siempre en cuenta que cuando pasemos de nuestro número base, debemos de hacer lo mismo que hacemos cuando usamos la base decimal; es decir "llevar uno" y hacer la suma normal.
Ahora probemos con otro número:
Sumamos, 0 + 0 = 0, 1 + 1 = 10, anotamos el cero y "llevamos uno", 1 + 1 = 10 + 1 (que llevábamos del anterior) = 11, anotamos el uno y otra vez llevamos el 1, 0 mas el uno que llevábamos = 1 y finalmente anotamos el uno.
Pero que pasa si sumamos mas de dos numero a la vez, supongamos que queremos sumar los números: 110, 111, 1010 y 1111
Empezamos de izquierda a derecha y tenemos: 0+1+1+1 = 11, anotamos el uno y llevamos una. 1+1+1+1 = 100 + 1 = 101, pero que pasa en estos casos? para poder realizar la suma siguiendo el mismo método, podemos sumar por pares a los números uno; es decir, en lugar de sumar 1+1+1+1+1, separamos a 1+1 , 1+1 y 0+1 (si no hay otro número uno ponemos un cero), y si en cada par el resultado es 10, simplemente llevamos un uno, en la imagen puedes ver que llevamos dos unos y tiene sentido, pues tenemos que 1+1 = 10, 1+1 = 10 y 0+1 = 1. Cómo se agrupan por pares y al sumar 1 + 1 siempre nos da 10, si hay un número que no tenga pareja, anotamos el uno en el resultado. Repetimos el procedimiento hasta llegar al extremo derecho, si ya no hay número en la suma original, pero aun nos "sobran unos", debemos de seguir sumado hasta que ya no haya mas.
Y bien, cómo podrás ver, la suma es realmente sencilla, mucho del procedimiento que usamos en las operaciones de base 10, lo podemos emplear en base 2, por lo que en el siguiente post, veremos cómo se hacen las otras tres operaciones básicas.
Los leo luego.
Back to basics #7 - Divisores resistivos.
Hola de nuevo a todos, el día de hoy vamos a ver un poco mas sobre el uso de las resistencias.
Hace algún tiempo hicimos un velocímetro para bicicleta, y todo funciona bien salvo un par de detalles. Un de las cosas que luego me pasa, es que la batería se acaba a la mitad del recorrido y cómo me es importante saber cuanta distancia hago en cada uno, siento que si se apaga el velocímetro a mitad del camino, éste simplemente ya no cuenta. Cómo ya van varias veces que me pasa, decidí mostrar la información de la batería en la pantalla (Aprovechando el espacio disponible en ella.) y así al menos tener una idea de cuando debo de cargar la batería.
Antes de empezar, hay que buscar un método para medir el voltaje; hay que recordar que el velocímetro está basado en arduino, esto significa que en las entradas podemos medir niveles de hasta 5V, la batería tiene niveles de 3v a 4.2v, esto significa que en teoría podríamos simplemente conectar la batería a una de las entradas y "medir", pero en general es una mala practica conectar directamente la batería al micro-controlador.
Para poder medir el voltaje de manera segura vamos a usar un divisor de tensión, pero antes de continuar veamos que es:
Y hay una formula que sirve para calcular cual es el voltaje que queremos usar. Para eso miremos la siguiente imagen:
Donde tenemos:
Ahora tomemos cómo ejemplo la siguiente configuración:
Si observas cuidadosamente, tenemos dos resistencia de 4.7 KΩ y 3v a la entrada que si reemplazamos en la formula
tenemos:
Y al realizar las mediciones, podemos comprobar que en efecto los cálculos son correctos:
Hace algún tiempo hicimos un velocímetro para bicicleta, y todo funciona bien salvo un par de detalles. Un de las cosas que luego me pasa, es que la batería se acaba a la mitad del recorrido y cómo me es importante saber cuanta distancia hago en cada uno, siento que si se apaga el velocímetro a mitad del camino, éste simplemente ya no cuenta. Cómo ya van varias veces que me pasa, decidí mostrar la información de la batería en la pantalla (Aprovechando el espacio disponible en ella.) y así al menos tener una idea de cuando debo de cargar la batería.
Antes de empezar, hay que buscar un método para medir el voltaje; hay que recordar que el velocímetro está basado en arduino, esto significa que en las entradas podemos medir niveles de hasta 5V, la batería tiene niveles de 3v a 4.2v, esto significa que en teoría podríamos simplemente conectar la batería a una de las entradas y "medir", pero en general es una mala practica conectar directamente la batería al micro-controlador.
Para poder medir el voltaje de manera segura vamos a usar un divisor de tensión, pero antes de continuar veamos que es:
Un divisor de tensión es una configuración de un circuito eléctrico que reparte la tensión de una fuente entre una o más impedancias conectadas en serie. wikipedia/divisordetensionPara crearlo, simplemente debemos de unir dos resistencias (o mas) en serie y tomar el voltaje de uno de los puntos medios cómo muestra el siguiente diagrama:
Y hay una formula que sirve para calcular cual es el voltaje que queremos usar. Para eso miremos la siguiente imagen:
Donde tenemos:
- V2 = Voltaje de salida
- R2 = El valor de la resistencia 2
- R1 = Valor de la resistencia 1
- V1 = Voltaje de entrada
Ahora tomemos cómo ejemplo la siguiente configuración:
Arreglo de resistencias
![]() |
| Tenemos 3v a la entrada |
Si observas cuidadosamente, tenemos dos resistencia de 4.7 KΩ y 3v a la entrada que si reemplazamos en la formula
tenemos:
Y al realizar las mediciones, podemos comprobar que en efecto los cálculos son correctos:
![]() |
| Medimos "en medio" de las resistencias |
Si no te gusta usar la formula, bastará con usar resistencias del mismo valor y el voltaje será proporcional, en el ejemplo anterior usamos dos resistencias de 4.7 por lo que al dividir entre dos nos resulta 1.5v.
Ahora de manera intuitiva, si usamos tres resistencias de 100kΩ y medimos en la primer sección tendremos una tercera parte del voltaje y si medimos en la segunda, tendremos dos terceras partes, eso significa que si usamos un voltaje de 3v a la entrada, tendríamos voltajes cercanos a 1v y 2v respectivamente. Ahora lo comprobaremos.
![]() |
| Ahora usamos tres resistencias de 100kΩ |
![]() |
| Voltaje en la primer unión |
![]() |
| Voltaje en la segunda unión |
Con esto podemos medir de manera más segura el voltaje directamente con el arduino, pero cómo siempre hay que tener consideraciones. La primera de ellas es que usar este método para reducir el voltaje no es la más conveniente si queremos alimentar un LED' por ejemplo, ya que implicaría un gasto de corriente adicional, pero además no funciona del todo bien y entre mas sea la corriente peor funcionará. La segunda, que valores son los que debemos de usar, eso depende mucho de la aplicación, pero bastara con resistencias dentro del rango de los kΩ y eso se debe a que el propio divisor resistivo gasta cierta potencia, si recordamos la ley del watt, si tenemos un divisor resistivo con dos resistencias de 4.7kΩ y un voltaje de 3v, la potencia que se disipa en las resistencias es de 0.0003w que no es mucho, pero si usamos resistencias de 10Ω en la misma configuración tendríamos un gasto de 0.15w (haciendo técnicamente nada). Para tener una mejor aproximación al resultado que queremos, debemos de usar resistencias de precisión, las resistencias que usé para el segundo ejemplo, no lo son y ahí es cuando se produce la diferencia (los colores dicen que son de 100kΩ pero en realidad son de 98kΩ~99kΩ).
Y bien, por ahora es todo, en el siguiente post veremos cómo medir el voltaje de una bateria usando arduino.
Los leo luego.
10/20/2019 05:55:00 p.m.
aprende
,
Basics
,
Divisores resistivos
,
Resistencias
Back to basics #6 - Resistencias y diodos LED.
Hola de nuevo a todos, el día de hoy vamos a ver un poco de cómo usar unos de mi componentes electrónicos favoritos: el diodo LED.
Imaginemos que en algun momento contruyes un velocímetro para una bicicleta y te levantas por las mañanas a hacer tu recorrido, pero un buen dia, por alguna razon las lamparas ddel alumbrado publico no encienden, al inicio supones que es algo normal, ya que las cosas tienden a fallar, pero tras tres semanas te das cuenta que probablemente no las van a reparar en fechas próximas por lo que decides agregarle "iluminacion" a tu bicicleta, pero surge una pregunta ¿Cómo alimentar la iluminacion?
Ultimamente se han hecho bastante accesibles los diodos LED, gracias a su alta eficiencia, son muy utiles a la hora de obtener alimentacion por medio de pilas o baterias pues nos asegura que estas duraran algo de tiempo; cosa que no pasaba antes con las lamparas que usaban filamento incandescentes y que se devoraban las pilas.
Si no has visto cómo es que hice el velocímetro, aun puedes hacerlo pero haciendo memoria, este funciona con un voltaje de 5 v, si intentamos conectar un diodo directamente, este explotaría.
Dependiendo del tipo de diodo LED, este requerirá mas o menos voltaje, en mi caso conseguí LED's de color rojo, amarillo, azul, verde y blanco. Cada uno posee una hoja de datos en la cual podemos cuales son las condiciones para que cada uno de ellos funcione, en el caso de los LED's rojos, la hoja de datos dice que se le debe de aplicar un voltaje 2.1 v y una corriente de 0.02 A (20 mili Amperes), al conectarlo a una fuente con esas características, el diodo enciende.
Pero si vemos bien en la imagen, si limitamos la corriente a 20 mA, el voltaje no es el que viene descrito en la hoja de datos, hay una diferencia de 0.1 V.
Para trabajar con diodos LED, lo primero que debemos de tomar en cuenta, es que no todos los diodos son iguales, la hoja de datos presentará datos nominales, pero en si cada uno es diferente. Al revisar 10 LED's rojos, si la corriente se mantiene constante, el voltaje varia desde los 1.9 V hasta los 2.2 V. Si a todos estos LED's se les alimenta con los 2.1V que dice la hoja de datos, los que funcionaron a los 1.9 V, se terminarán "acabando" mas rápido, debido que a mayor voltaje (del requerido), mayor corriente va a circular, generado calor que es uno de los enemigos de los LED, ya que a mayor temperatura, mayor corriente circula por ellos.
Si no se dispone de una fuente con control de corriente o cómo en mi caso, no es facil agregar un control de corriente (porque soy flojo), podemos simplemente agregar una resistencia que sirva para limitar la corriente.
En algunos de los post pasados hemos usado LED's y algunos de los visitantes del blog me han preguntado si podía hacer una calculadora que sirva para calcular la resistencia para llevarla en el teléfono y eso es lo que haremos, pero no en este post; al igual que en ocasiones anteriores, primero veremos como hacer los cálculos "a mano".
Imaginemos que en algun momento contruyes un velocímetro para una bicicleta y te levantas por las mañanas a hacer tu recorrido, pero un buen dia, por alguna razon las lamparas ddel alumbrado publico no encienden, al inicio supones que es algo normal, ya que las cosas tienden a fallar, pero tras tres semanas te das cuenta que probablemente no las van a reparar en fechas próximas por lo que decides agregarle "iluminacion" a tu bicicleta, pero surge una pregunta ¿Cómo alimentar la iluminacion?
Ultimamente se han hecho bastante accesibles los diodos LED, gracias a su alta eficiencia, son muy utiles a la hora de obtener alimentacion por medio de pilas o baterias pues nos asegura que estas duraran algo de tiempo; cosa que no pasaba antes con las lamparas que usaban filamento incandescentes y que se devoraban las pilas.
Si no has visto cómo es que hice el velocímetro, aun puedes hacerlo pero haciendo memoria, este funciona con un voltaje de 5 v, si intentamos conectar un diodo directamente, este explotaría.
Dependiendo del tipo de diodo LED, este requerirá mas o menos voltaje, en mi caso conseguí LED's de color rojo, amarillo, azul, verde y blanco. Cada uno posee una hoja de datos en la cual podemos cuales son las condiciones para que cada uno de ellos funcione, en el caso de los LED's rojos, la hoja de datos dice que se le debe de aplicar un voltaje 2.1 v y una corriente de 0.02 A (20 mili Amperes), al conectarlo a una fuente con esas características, el diodo enciende.
![]() |
| La corriente esta limitada a 20mA |
Pero si vemos bien en la imagen, si limitamos la corriente a 20 mA, el voltaje no es el que viene descrito en la hoja de datos, hay una diferencia de 0.1 V.
Para trabajar con diodos LED, lo primero que debemos de tomar en cuenta, es que no todos los diodos son iguales, la hoja de datos presentará datos nominales, pero en si cada uno es diferente. Al revisar 10 LED's rojos, si la corriente se mantiene constante, el voltaje varia desde los 1.9 V hasta los 2.2 V. Si a todos estos LED's se les alimenta con los 2.1V que dice la hoja de datos, los que funcionaron a los 1.9 V, se terminarán "acabando" mas rápido, debido que a mayor voltaje (del requerido), mayor corriente va a circular, generado calor que es uno de los enemigos de los LED, ya que a mayor temperatura, mayor corriente circula por ellos.
Si no se dispone de una fuente con control de corriente o cómo en mi caso, no es facil agregar un control de corriente (porque soy flojo), podemos simplemente agregar una resistencia que sirva para limitar la corriente.
En algunos de los post pasados hemos usado LED's y algunos de los visitantes del blog me han preguntado si podía hacer una calculadora que sirva para calcular la resistencia para llevarla en el teléfono y eso es lo que haremos, pero no en este post; al igual que en ocasiones anteriores, primero veremos como hacer los cálculos "a mano".
Aguantando con resistencia.
Para empezar, lo primero que debemos de tomar en cuenta es la ley del Ohm.
- Donde R es la resistencia que se mide en Ohm y su símbolo es "Ω".
- V es el voltaje que se mide en volt y su símbolo es "V".
- I es la corriente que se mide en Ampere y su símbolo es "A".
Para conectar, la resistencia, simplemente debemos de ponerla en serie con el diodo.
De esta forma la resistencia "disipara" el voltaje excedente, es decir si vemos la imagen anterior, tendremos que la resistencia deberá de hacer algo con los 5V de entrada menos los 3.1V del diodo, es decir 5 V - 3.1 V = 1.9 V y aquí es donde entra la ley del Ohm, el revisar la formula, vemos que necesitamos tres componentes: la resistencia, el voltaje y la corriente, pero de estos solo conocemos dos que son: el voltaje y la corriente por lo tanto si sustituimos los valores en la ecuación, tendremos:
Si tenemos un diodo 20 mA a 3.1 V y lo alimentamos con 5 V, necesitamos una resistencia de 95 Ω para que el diodo no se queme.
Ahora supongamos que conectamos diez diodos de las mismas características en paralelo, es posible poner una sola resistencia, pero debemos de tener algunas cosas en consideración, pero primero los cálculos.
Tenemos una corriente de 20 mA * 10 = 200 mA (hay que recordar que en este caso, en paralelo la corriente aumenta pero no el voltaje. Cosa contraria a cuando se hacen las conexiones en serie), el voltaje que "caerá" en la resistencia es el mismo, ya que usamos los mismos 5V para alimentar el circuito.
Al momento de elegir el tipo de resistencia, debemos de tener en cuenta cuanta potencia es capaz de disipar, en esto casos, la resistencia más común de 0.250W por lo que si excedemos esa potencia, esta se destruirá.
Para calcular cual es la potencia que una resistencia debe de soportar, debemos de recurrir a la ley del Watt que la siguiente:
Donde:
- P es la potencia que se mide en Watts y su símbolo es "W".
- V es el voltaje que se mide en Volts y su símbolo es "V".
- I es la corriente que se mide en Ampere y su símbolo es "A".
Tomado el ultimo ejemplo tenemos:
Por lo quedemos de usar una resistencia de 9.5Ω a medio Watt (que es lo mas común).
Dado que toda la energía no usada por el LED es disipada en calor por la resistencia, esta es una forma no muy conveniente de regularlo, pero para pocos LED's sirve.
Y bien, por ahora es todo, en el siguiente post haremos una calculadora para android que nos ayude a calcular la resistencia y la potencia de esta para poder usarlas, además veremos otras posibles soluciones.
Los leo luego.
3/31/2019 03:53:00 p.m.
Basics
,
LED
,
Resistencias
Back to basics #5 - Prefijos y potencias.
Hola de nuevo a todos, el día de hoy vamos a hablar un poco de sobre las potencias de 10.
Hace algunos días, fui a comprar un par de capacitores a la tienda de electronica más cercana a mi casa, al llegar, el tecnico me pidio amablemente mi orden a lo cual dije "quiero 2 capacitores de 22 pF", reviso una tabla y no vio cual era el numero para 22 pF (pico faradios), entonces le dije, "son 22pF, el capacitor deberia de tener un numero 22 en la parte de enfrente", reviso y no lo tenía, a lo cual me ofrecio uno de 22 µF, de inmediato le dije que era un valor exageradamente grande.
De inmediato puso cara de sorpresa y fue aun mayor cuando le dije que 1 µF es un millon de veces 1 pF, la explicación se la di y de paso anote la mayoria de prefijos y sus equivalencias.
Hace algunos días, fui a comprar un par de capacitores a la tienda de electronica más cercana a mi casa, al llegar, el tecnico me pidio amablemente mi orden a lo cual dije "quiero 2 capacitores de 22 pF", reviso una tabla y no vio cual era el numero para 22 pF (pico faradios), entonces le dije, "son 22pF, el capacitor deberia de tener un numero 22 en la parte de enfrente", reviso y no lo tenía, a lo cual me ofrecio uno de 22 µF, de inmediato le dije que era un valor exageradamente grande.
De inmediato puso cara de sorpresa y fue aun mayor cuando le dije que 1 µF es un millon de veces 1 pF, la explicación se la di y de paso anote la mayoria de prefijos y sus equivalencias.
Tabla de prefijos y sus valores.
La siguiente tabla muestra los prefijos más comunes:
| Nombre | Simbolo | Multiplicador | Potencia |
|---|---|---|---|
| yotta | Y | 1 000 000 000 000 000 000 000 000 | 10^24 |
| zetta | Z | 1 000 000 000 000 000 000 000 | 10^21 |
| exa | E | 1 000 000 000 000 000 000 | 10^18 |
| peta | P | 1 000 000 000 000 000 | 10^15 |
| tera | T | 1 000 000 000 000 | 10^12 |
| giga | G | 1 000 000 000 | 10^9 |
| mega | M | 1 000 000 | 10^6 |
| kilo | k | 1 000 | 10^3 |
| mili | m | 0.001 | 10^-3 |
| micro | µ | 0.000 001 | 10^-6 |
| nano | n | 0.000 000 001 | 10^-9 |
| pico | p | 0.000 000 000 001 | 10^-12 |
| femto | f | 0.000 000 000 000 001 | 10^-15 |
| atto | a | 0.000 000 000 000 000 001 | 10^-18 |
| zepto | z | 0.000 000 000 000 000 000 001 | 10^-21 |
| yocto | y | 0.000 000 000 000 000 000 000 001 | 10^-24 |
Con lo anterior, podemos nombrar cualquier cantidad, algunos de ellos te resultarán familiares; kilo, mega, giga e incluso mili. Ahora sabrás que cuando alguien dice que tiene kilo-algo, se refiere a que tienen 1000 de ese algo.
En adicion, hay algunos prefijos que no se listan en la tabla anterior, incluso algunos se usan cotidianamente cómo el caso de "centi", este se usa cuando tomamos algo y lo dividimos en 100, tal cómo el caso del centimetro, pero decidi no agregarlo, puesto que en la mayoria de lecturas de este blog, siempre usaremos algunas de las listadas en la tabla anterior.
Y bien, por ahora es todo, en el siguiente post continuaremos con más sobre programación.
Los leo luego.
Y bien, por ahora es todo, en el siguiente post continuaremos con más sobre programación.
Los leo luego.
Learning Machine #2 - Programando en pascal - Fundamentos del lenguaje.
Hola de nuevo a todos, el día de hoy vamos a continuar con el aprendizaje del lenguaje de programación en pascal. En el post anterior vimos un poco sobre el ciclo de vida de un programa (para este y todo los lenguajes). En este post vamos a ver un poco más sobre Pascal.
Palabras reservadas.
Al igual que todos los otros lenguajes de programación, en Pascal se usan una serie de palabras que tienen una función en especifico y no puede ser usadas como nombres para variables.
La siguiente lista muestra las palabras reservadas en Free Pascal (su uso las veremos más adelante):
La siguiente lista muestra las palabras reservadas en Free Pascal (su uso las veremos más adelante):
- absolute
- and
- array
- asm
- begin
- case
- const
- constructor
- destructor
- div
- do
- downto
- else
- end
- file
- for
- function
- goto
- if
- implementation
- in
- inherited
- inline
- interface
- label
- mod
- nil
- not
- object
- of
- operator
- or
- packed
- procedure
- program
- record
- reintroduce
- repeat
- self
- set
- shl
- shr
- string
- then
- to
- type
- unit
- until
- uses
- var
- while
- with
- xor
Simbolos.
En el lenguaje de programación Pascal, se reconocen todos los símbolos en el estandar ASCII, pero ademas, los siguiente símbolos tienen un uso especial:
- +
- -
- *
- /
- =
- <
- >
- [ ]
- .
- ,
- ( )
- :
- ^
- @
- { }
- $
- #
- &
- %
Y los siguientes pares de símbolos también:
- <<
- >>
- **
- <>
- ><
- <=
- >=
- :=
- +=
- -=
- *=
- /=
- (*
- *)
- (.
- .)
- //
Comentarios.
Los comentarios son partes de código que van a ser omitidos por el compilador al momento de generar el ejecutable. Principalmente se usan para proporcionar información adicional en el código, en pascal, se puede comentar de tres maneras distintas. supongamos el siguiente código:
Program HelloWorld(output);
uses crt;
(* Aqui empieza la parte principal *)
begin
clrscr;
writeln('Hello World');
(* Usamos readln() para esperar que se presione enter *)
readln();
end.
Ahora el siguiente:
Program HelloWorld(output);
uses crt;
{ Aqui empieza la parte principal }
begin
clrscr;
writeln('Hello World');
{ Usamos readln() para esperar que se presione enter }
readln();
end.
Y el siguiente:
En todos los casos anteriores, el código es exactamente igual, solo que se usan todas las formas de comentar disponibles.
Y bien, por ahora es todo, en el siguiente post seguiremos viendo más sobre el lenguaje de programación Pascal.
Los leo luego.
Program HelloWorld(output);
uses crt;
//Aqui empieza la parte principal
begin
clrscr;
writeln('Hello World');
//Usamos readln() para esperar que se presione enter
readln();
end.
En todos los casos anteriores, el código es exactamente igual, solo que se usan todas las formas de comentar disponibles.
Y bien, por ahora es todo, en el siguiente post seguiremos viendo más sobre el lenguaje de programación Pascal.
Los leo luego.
6/15/2017 06:18:00 p.m.
aprende
,
Basics
,
Learning Machine
,
pascal
Learning machine #1 - Programando en Pascal.
Hola de nuevo a todos, el día de hoy vamos a ver una introduccion al mundo de la programación.
Varios usuarios me han preguntado (atraves del formulario de contacto) sobre la posibilidad de crear "tutoriales" para aprender a programar, al inicio no me gustaba la idea, porque no soy bueno explicando, pero alguien alguna vez dijo: "Cuando enseñas tu tambien aprendes", entonces, trataré de hacer algunos post en donde mostraré las cuestiones básicas (y un poco más).
Al inicio no se me ocurria en que programa empezar así que en vez de ir a C#; porque hay mucho código en el post o java (para android), decidí empezar con lo que yo empecé: Pascal.
Si bien no es un lenguaje muy popular ni mucho menos nuevo, creo que sirve para sentar las bases que cualquier programador necesita.
Para empezar, descargaremos el IDE de Pascal desde su página. Antes de empezar vamos a ver el ciclo de vida de un programa.
El diseño, este consiste en tratar de pasar el algoritmo que se concebi antes al código, esta parte es esencial y muy importante, dado que el programa resultante será la implementación del código que nosotros hayamos escrito. Un buen código producirá una buena ejecución.
Las pruebas, estas deben de realizarse para corregir errores y tratar de evitarlos lo más que se pueda. En está etapa debemos de probar las cosas más absurdas. Es importante probar la mayoría de los escenarios posibles, en algunas ocasiones, lo errores serán producto de las propias limitantes del lenguaje de programación, otras serán producto de nuestro propio descuido, y finalmente vendrán lo errores que el usuario pueda causar. Es importante que tratemos de no asumir, por más absurdo que algo nos pueda parecer, hay que manejarlo cómo es debido. Supongamos que seguimos con el programa de la calculadora, el usuario la ejecuta y quiere hacer una división; 13/0. Todos los lenguajes producirán un error si se quiere dividir cualquier número entre 0 y si no hay un manejo adecuado, la aplicación simplemente se cerrará (o peor, puede comprometer todo el sistema, eso dependiendo de que es lo que hacemos). La manera de evitarlo, sera comprobar cual es el valor del divisor y si es 0 simplemente no hacer la operación y decirle al usuario cual fue la razón por la que no se pudo resolver su operación.
Finalmente la implementacion, esta parte corresponde a la ejecucion, cuando ya se han hecho las debidas pruebas y hemos minimizado los errores, si es cierto, siempre, cualquier programa será propenso a los errores (aun si llevas decadas programando), pero siempre (y aunque suene repetitivo) debemos de probar la mayoria de escenarios posibles.
Un programa en pascal consiste de 5 partes:
Para hacer la declaración de las librerías que vamos a usar, debemos de hacer uso de la palabra reservada "uses" seguida del nombre de la librería (por ahora solo usamos crt que proporciona funciones básicas).
Después vendría la declaración de las variables que vayamos a usar, la palabra reservada "begin" indica el inicio del programa en sí, seguido de está, debemos de escribir el código de la aplicación.
"clrscr;"limpia la pantalla, es decir borra todo el contenido previo y deja lista la ventana en "blanco". "writeln("Hello World");" la función "writeln" se usa para mostrar texto pero además, inserta un linea nueva al final. "readln();" se usa para que el programa reciba texto por parte del usuario, en programas simples, es recomendable usar un "readln();" al final del programa, porque cuando acaba la ejecución, el programa se cierra de manera inmediata, en el código anterior, si no usáramos la función, al ejecutar la aplicación solo veríamos una ventana negra que se cierra de inmediato. "end." se usa para indicar que es el fin del programa.
Y bien, por ahora es todo, en el siguiente post veremos cómo usar librerías y ademas vernos cuales son las más comunes y las funciones que ofrecen, además de los tipos de datos que podemos usar en Pascal.
Los leo luego.
Varios usuarios me han preguntado (atraves del formulario de contacto) sobre la posibilidad de crear "tutoriales" para aprender a programar, al inicio no me gustaba la idea, porque no soy bueno explicando, pero alguien alguna vez dijo: "Cuando enseñas tu tambien aprendes", entonces, trataré de hacer algunos post en donde mostraré las cuestiones básicas (y un poco más).
Al inicio no se me ocurria en que programa empezar así que en vez de ir a C#; porque hay mucho código en el post o java (para android), decidí empezar con lo que yo empecé: Pascal.
Si bien no es un lenguaje muy popular ni mucho menos nuevo, creo que sirve para sentar las bases que cualquier programador necesita.
Para empezar, descargaremos el IDE de Pascal desde su página. Antes de empezar vamos a ver el ciclo de vida de un programa.
Ciclo de vida de un programa/aplicación.
El ciclo de vida consiste basicamente de cuatro partes:- Analisis.
- Diseño.
- Pruebas.
- Implementacion.
El diseño, este consiste en tratar de pasar el algoritmo que se concebi antes al código, esta parte es esencial y muy importante, dado que el programa resultante será la implementación del código que nosotros hayamos escrito. Un buen código producirá una buena ejecución.
Las pruebas, estas deben de realizarse para corregir errores y tratar de evitarlos lo más que se pueda. En está etapa debemos de probar las cosas más absurdas. Es importante probar la mayoría de los escenarios posibles, en algunas ocasiones, lo errores serán producto de las propias limitantes del lenguaje de programación, otras serán producto de nuestro propio descuido, y finalmente vendrán lo errores que el usuario pueda causar. Es importante que tratemos de no asumir, por más absurdo que algo nos pueda parecer, hay que manejarlo cómo es debido. Supongamos que seguimos con el programa de la calculadora, el usuario la ejecuta y quiere hacer una división; 13/0. Todos los lenguajes producirán un error si se quiere dividir cualquier número entre 0 y si no hay un manejo adecuado, la aplicación simplemente se cerrará (o peor, puede comprometer todo el sistema, eso dependiendo de que es lo que hacemos). La manera de evitarlo, sera comprobar cual es el valor del divisor y si es 0 simplemente no hacer la operación y decirle al usuario cual fue la razón por la que no se pudo resolver su operación.
Finalmente la implementacion, esta parte corresponde a la ejecucion, cuando ya se han hecho las debidas pruebas y hemos minimizado los errores, si es cierto, siempre, cualquier programa será propenso a los errores (aun si llevas decadas programando), pero siempre (y aunque suene repetitivo) debemos de probar la mayoria de escenarios posibles.
Estructura de un programa en pascal.
- Titulo del programa.
- Declaracion de librerias.
- Declaracion de variables.
- Cuerpo del programa
- Implementacion.
- Fin del programa.
Para hacer la declaración de las librerías que vamos a usar, debemos de hacer uso de la palabra reservada "uses" seguida del nombre de la librería (por ahora solo usamos crt que proporciona funciones básicas).
Después vendría la declaración de las variables que vayamos a usar, la palabra reservada "begin" indica el inicio del programa en sí, seguido de está, debemos de escribir el código de la aplicación.
"clrscr;"limpia la pantalla, es decir borra todo el contenido previo y deja lista la ventana en "blanco". "writeln("Hello World");" la función "writeln" se usa para mostrar texto pero además, inserta un linea nueva al final. "readln();" se usa para que el programa reciba texto por parte del usuario, en programas simples, es recomendable usar un "readln();" al final del programa, porque cuando acaba la ejecución, el programa se cierra de manera inmediata, en el código anterior, si no usáramos la función, al ejecutar la aplicación solo veríamos una ventana negra que se cierra de inmediato. "end." se usa para indicar que es el fin del programa.
Y bien, por ahora es todo, en el siguiente post veremos cómo usar librerías y ademas vernos cuales son las más comunes y las funciones que ofrecen, además de los tipos de datos que podemos usar en Pascal.
Los leo luego.
6/08/2017 06:14:00 p.m.
aprende
,
Basics
,
lazarus
,
Learning Machine
,
pascal
Back to basics #4 - Eligiendo al mejor tipo.
Hola de nuevo a todos, el día de hoy vamos a continuar con lo básico. En el post anterior, vimos cómo al elegir un tipo de variable, puede ser determinante a la hora de que se producen los errores.
Antes que nada vamos a ver cuales son los tipos disponibles en C# y Java en la siguiente tabla:
La tabla anterior está disponible en la página de ayuda de MSDN,
Ahora, que es lo que debemos antes de empezar a crear una aplicación, bueno, debemos de tener muy claro que es lo que queremos lograr, si no tenemos eso muy claro desde el principio, es muy posible que a medio programa encontremos algunas dificultades. En C# disponemos de 15 tipos de variables y es necesario saber que tipo de datos se almacenan en cada una.
Antes que nada vamos a ver cuales son los tipos disponibles en C# y Java en la siguiente tabla:
| Nombre corto | Clase .NET | Tipo | Ancho | Intervalo (bits) |
|---|---|---|---|---|
| byte | Byte | Entero sin signo | 8 | 0 a 255 |
| sbyte | SByte | Entero con signo | 8 | -128 a 127 |
| int | Int32 | Entero con signo | 32 | -2.147.483.648 a 2.147.483.647 |
| uint | UInt32 | Entero sin signo | 32 | 0 a 4294967295 |
| short | Int16 | Entero con signo | 16 | -32.768 a 32.767 |
| ushort | UInt16 | Entero sin signo | 16 | 0 a 65535 |
| long | Int64 | Entero con signo | 64 | -922337203685477508 a 922337203685477507 |
| ulong | UInt64 | Entero sin signo | 64 | 0 a 18446744073709551615 |
| float | Single | Tipo de punto flotante de precisión simple | 32 | -3,402823e38 a 3,402823e38 |
| double | Double | Tipo de punto flotante de precisión doble | 64 | -1,79769313486232e308 a 1,79769313486232e308 |
| char | Char | Un carácter Unicode | 16 | Símbolos Unicode utilizados en el texto |
| bool | Boolean | Tipo Boolean lógico | 8 | True o false |
| object | Object | Tipo base de todos los otros tipos | ||
| string | String | Una secuencia de caracteres | ||
| decimal | Decimal | Tipo preciso fraccionario o integral, que puede representar números decimales con 29 dígitos significativos | 128 | ą1.0 × 10e?28 a ą7.9 × 10e28 |
Ahora, que es lo que debemos antes de empezar a crear una aplicación, bueno, debemos de tener muy claro que es lo que queremos lograr, si no tenemos eso muy claro desde el principio, es muy posible que a medio programa encontremos algunas dificultades. En C# disponemos de 15 tipos de variables y es necesario saber que tipo de datos se almacenan en cada una.
¿Cómo aplicar el tamaño adecuado a las variables?
Muchas veces hay que elegir que tipo de variables son la que debemos de usar en determinada parte de nuestro programa, generalmente siempre se buscará usar la variable más grande disponible, eso siempre y cuando no sepamos cual será el valor que está poseerá. Pero es recomendables hacer eso?, por supuesto que no! siempre debemos de tratar de tener el menor consumo de memoria.
Imaginemos que tenemos un programa en el cual una variable va a recibir el valor que el usuario introduzca, así que creamos una variable del tipo long (cuyo valor máximo es 922337203685477507), en tiempos modernos funciona de maravilla y nos ahorra muchos dolores de cabeza, finalmente que son 64 bits de 32,000,000,000 que hay disponibles en la mayoria de las computadoras (64 de 8,000,000,000 de los móviles). Pero la cosa no siempre fue así, hace no mucho tiempo, la cantidad de memoria era mucho más limitada, los computadores más potentes solamente tenían 64MBytes de RAM, por lo que administrar de manera prudente los recursos era primordial para el buen desarrollador de software. Entonces asumir no era una opcion, en ese caso lo que se hacia limitar al usuario, poner las condiciones pertinentes para que todo este dentro de los esperado. Podemos concluir que siempre debemos de usar la variable del tipo mas razonablemente pequeña y condicionar al usuario a que se ajuste, solo en casos realmente específicos es cuando debemos de adecuar el programa al usuario.
¿Cuando si debemos de ajustarnos?
En tiempos recientes es difícil citar un caso en el cual el programa deba de ajustarse a las condiciones del usuario. Hace no mucho tiempo una canción coreana se volvió inmensamente popular y la plataforma de videos más popular no estaba lista para poder llevar la cuenta, entonces un día, este video hizo lo impensable (por esas fechas) paso las 2,147,483,647 vistas y cómo vimos en el post anterior, un valor del tipo "int" no puede mostrar un número mas allá de ese y pasó lo que tenía que pasar, los desarrolladores se vieron en la necesidad de actualizar su código y ahora en lugar de usar una variable del tipo "int", optaron por usar valores de tipo long. Es una buena solución, ya que 922,337,203,685,477,507 es aproximadamente 131,762,457 la población de la tierra, más que suficiente en mi opinión.
Otro problema de este tipo surge con los equipos relativamente viejos, en ellos el tiempo se mide en segundos y se almacena en una espacio de 32 bits, haciendo cálculos, en el 2038 habrán alcanzado el limite que se puede almacenar en 32bits, pero este a diferencia del caso anterior es un poco mas complejo en su resolución. Muchos dirán que se puede arreglar con solo usar 64 bits para almacenar el tiempo, pero cuando se realizan operaciones de forma binaria se perdería compatibilidad con el software viejo. Muchos de los que previeron el problema hicieron que el hardware fuera compatible con 64bits y crearon software especifico para la plataforma, por lo que se evitarían el problema.
Otro problema de este tipo surge con los equipos relativamente viejos, en ellos el tiempo se mide en segundos y se almacena en una espacio de 32 bits, haciendo cálculos, en el 2038 habrán alcanzado el limite que se puede almacenar en 32bits, pero este a diferencia del caso anterior es un poco mas complejo en su resolución. Muchos dirán que se puede arreglar con solo usar 64 bits para almacenar el tiempo, pero cuando se realizan operaciones de forma binaria se perdería compatibilidad con el software viejo. Muchos de los que previeron el problema hicieron que el hardware fuera compatible con 64bits y crearon software especifico para la plataforma, por lo que se evitarían el problema.
En el caso de las aplicaciones que he hecho para el blog, lo admito, he sido flojo, pero muchos de los errores que tienen son de los más básicos y por más simple que sea, siempre se debe de entregar software lo mas completo y listo posible. A partir de eso, la mayoría de programas se van a actualizar para quitar todas las partes "flojas".
Y bien por ahora es todo, los leo luego.
Y bien por ahora es todo, los leo luego.
6/01/2017 07:04:00 p.m.
Basics
,
csharp
,
programacion
Back to basics #3 - Variables y sus tipos.
Hola de nuevo a todos, el día de hoy vamos a ver un poco más de las nociones básicas de programación.
En los post anteriores, hemos visto que resulta relativamente fácil portar un pedazo de código que hace algo, de una plataforma a otra, en el caso particular de C# y java, el código es especialmente parecido.
Al momento de crear código, uno debe de tener en mente que es lo que desea crear, pero no solo eso, también debe de imagina el cómo lo va a hacer, eso incluye: procedimientos,funciones y variables.
El caso de la variables es donde debemos de prestar especial atención ya que en ellas es donde se almacenarán los resultados de la ejecución, entonces si escogemos mal el tipo de variable, podemos echar a perder una buena ejecución.
En los post anteriores, hemos visto que resulta relativamente fácil portar un pedazo de código que hace algo, de una plataforma a otra, en el caso particular de C# y java, el código es especialmente parecido.
Al momento de crear código, uno debe de tener en mente que es lo que desea crear, pero no solo eso, también debe de imagina el cómo lo va a hacer, eso incluye: procedimientos,funciones y variables.
El caso de la variables es donde debemos de prestar especial atención ya que en ellas es donde se almacenarán los resultados de la ejecución, entonces si escogemos mal el tipo de variable, podemos echar a perder una buena ejecución.
El caso concreto: DecToAny.
Recientemente publiqué un par de programas que se encargaban de convertir un número decimal a cualquier base en el rango 2-35, todo parecía funcionar bien, eso al menos hasta el número 2,147,483,647, intentar convertir el número 2,147,483,648 produce un fallo que causa que la aplicación se detenga.
Al inspeccionar la imagen, podemos ver que el error es: OverflowException (en el caso de C#, pero te aseguro que es el mismo para java). Este tipo de errores/excepciones, se producen cuando intentamos asignar un valor más grande del que la variable puede manejar. hay que recordar que para almacenar el valor de entrada en la función que convierte el numero, usamos una variable del tipo "int" y si buscamos el valor máximo que este tipo de variable puede almacenar tenemos que es 2,147,483,647 y el mínimo es -2,147,483,648, eso quiere decir que se intentamos guardar un numero por arriba (o por abajo), simplemente no podremos hacerlo.
Un poco más del tipo int.
El tipo int es uno de los más comunes que usaremos, en la vida real hay muy pocas cosas que requieran un numero tan grande, pero porque solo puede almacenar ese numero? Bueno, la razón es porque utiliza un espacio de 32 bits, pero no todos están disponibles para almacenar el valor del número, el primer byte (de izquierda a derecha), se usará para almacenar el signo, cuando este byte tenga 1, indicará que es un número negativo, para el caso contrario, será positivo.
![]() |
| Si cuentas los unos, verás 31 de ellos, el 32 está reservado para el signo. |
Para solucionar el error, debemos de escoger una variable que pueda contener un valor más grande, pero que tenga características similares a la que usamos actualmente y la más parecida es "long" que puede almacenar un valor de -922337203685477508 a 922337203685477507, más que suficiente para nosotros. Por ahora queda de tarea ajustar el programa en C#.
Y bien, por ahora es todo, en el transcurso de la semana actualizaré los programas.
Por ahora es todo, los leo luego.
5/25/2017 05:41:00 p.m.
Basics
,
binario
,
Convertidor de bases
,
decimal
,
hexadecimal
,
how to
,
octal
,
programacion
Vamos a programar #36 - DecToAny, versión Javascript.
Hola de nuevo a todos, el día de hoy vamos a ver el mismo programa que vimos en el post anterior.
Te preguntarás, lo mismo, otra vez? En esencia es lo mismo, lo único que cambia es el lenguaje en el cual se ejecuta.
Inicialmente iba a hacer la aplicacion para andoid, pero gente me pidio una version en javascript, entonces por eso decidi hace primero esta versióm (y adivinaste, la semana que viene publicaré la version android).
Te preguntarás, lo mismo, otra vez? En esencia es lo mismo, lo único que cambia es el lenguaje en el cual se ejecuta.
Inicialmente iba a hacer la aplicacion para andoid, pero gente me pidio una version en javascript, entonces por eso decidi hace primero esta versióm (y adivinaste, la semana que viene publicaré la version android).
El código.
El código en javascript que convierte de decimal a otras bases es el siguiente:
<html>
<head>
<title>Convertidor de decimal a otras bases</title>
<style type="text/css">
.h1Cal
{
font-size: 14px;
}
.formDecToAny{
font: 95% Arial, Helvetica, sans-serif;
max-width: 400px;
margin: 10px auto;
padding: 16px;
background: #F9F9F9;
}
.TextCal
{
width: 100%;
box-sizing: border-box;
border: 2px solid #999;
border-radius: 4px;
}
.ButtonCal
{
width: 100%;
background-color: #26c6da;
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
-webkit-transition-duration: 0.4s; /* Safari */
transition-duration: 0.4s;
}
.ButtonCal:hover
{
width: 100%;
background-color: #35d5e5;
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
}
</style>
<script type="text/javascript">
function DecToAny(Number, Base){
var LastNumber = parseInt(Number, 10);
var Garbage;
var result = []
debugger;
if (LastNumber < Base)
{
result.push(LastNumber);
}
else
{
while (LastNumber >= Base) {
Garbage = LastNumber % Base;
LastNumber = Math.floor(LastNumber / Base);
if (LastNumber < Base)
{
result.push(Garbage.toString());
result.push(LastNumber.toString());
}
else
{
result.push(Garbage.toString());
}
}
}
return result;
}
function NumberToChar(Number){
if(Number < 10)
return Number;
else
return String.fromCharCode(parseInt(Number, 10) + 55);
}
function ArrayToString(){
var GetNumber = document.getElementById('InputNumber').value;
var GetBase = document.getElementById('InputBase').value;
if(GetNumber.length < 1 || GetBase.length < 1)
{
alert('El numero/base no puede estar en blanco');
return;
}
var Convert = DecToAny(GetNumber,GetBase);
var Out = "";
Convert.reverse()
for(var i = 0; i < Convert.length; i++)
{
Out = Out + NumberToChar(Convert[i])
}
document.getElementById('Result').value = Out;
}
</script>
</head>
<body>
<form class="formDecToAny">
<span class="h1Cal">Numero decimal a convertir:</span>
<input class="TextCal" id="InputNumber" type="text"></input><br />
<span class="h1Cal">Base a la cual convertir:</span>
<input class="TextCal" id="InputBase" type="text"></input><br />
<br />
<input class="ButtonCal" id="ToAny" onclick="ArrayToString()" type="button" value="Convertir" /><br />
<br />
<span class="h1Cal">Resultado:</span>
<input class="TextCal" id="Result" type="text"></input><br />
<br />
</form>
</body>
</html>
El código esta formado por 3 funciones. La priera es "DecToAny", esta será la encargada de hacer los cálculos, hay que recordar que todo el proceso se lleva a cabo por una sucesión de divisiones. Esta función recibe dos parámetros, el primero es el número que queremos convertir, el segundo es la base objetivo. Devuelve una matriz que contiene los valores en orden inverso.
La segunda función es "NumberToChar", esta recibe un número cómo parámetro y lo único que hace es comprobar si el número es menor a 10, si es así, entonces solo devuelve el número que se ingreso, en caso contrario, convertirá el número ingresado cómo parámetro y lo devolverá con el valor correcto, hay que recordar que cuando usamos el décimo dígito en una base 12; por ejemplo; no podemos poner 0,2,3,4,5,6,7,8,9,10,11,12 (que serian los doce dígitos necesarios para representar todos los números simples hasta la base), en su lugar, debemos de recurrir a letras: 0,1,2,3,4,5,6,7,8,9,0,A,B. Con está función tenemos disponible hasta el dígito Z (base 35).
Finalmente tenemos la función "ArrayToString" que se encarga de convertir todos los datos de la matriz devuelta por la función "DecToAny" a un formato legible para las personas, internamente también llama a la función "NumberToChar" para que el resultado contenga letras cuando se hace uso del décimo o más. Cuando se quiera convertir un número, esta es la función que se debe mandar a llamar.
Para el formulario, solamente se hace uso de tres Textbox(text), uno servirá para introducir el número a convertir, otro recibirá la base de destino y el tercero mostrará el resultado. Ademas se hace el uso de un boton(button) que al hacer clic sobre el, mandará a llamar a la función "ArrayToString".
Cómo podrás ver, el código es realmente similar al de la versión C# que hicimos en el post anterior, con esto quiero demostrar que resulta relativamente fácil portar un programa de un lenguaje a otro, ahora solo queda pendiente la versión para android, pero eso será la semana que viene. Cómo siempre, el código completo lo puedes descargar de mi dropbox, pero además la versión online también esta disponible para su ejecución en este blog.
Por ahora es todo. Los leo luego.
La segunda función es "NumberToChar", esta recibe un número cómo parámetro y lo único que hace es comprobar si el número es menor a 10, si es así, entonces solo devuelve el número que se ingreso, en caso contrario, convertirá el número ingresado cómo parámetro y lo devolverá con el valor correcto, hay que recordar que cuando usamos el décimo dígito en una base 12; por ejemplo; no podemos poner 0,2,3,4,5,6,7,8,9,10,11,12 (que serian los doce dígitos necesarios para representar todos los números simples hasta la base), en su lugar, debemos de recurrir a letras: 0,1,2,3,4,5,6,7,8,9,0,A,B. Con está función tenemos disponible hasta el dígito Z (base 35).
Finalmente tenemos la función "ArrayToString" que se encarga de convertir todos los datos de la matriz devuelta por la función "DecToAny" a un formato legible para las personas, internamente también llama a la función "NumberToChar" para que el resultado contenga letras cuando se hace uso del décimo o más. Cuando se quiera convertir un número, esta es la función que se debe mandar a llamar.
Para el formulario, solamente se hace uso de tres Textbox(text), uno servirá para introducir el número a convertir, otro recibirá la base de destino y el tercero mostrará el resultado. Ademas se hace el uso de un boton(button) que al hacer clic sobre el, mandará a llamar a la función "ArrayToString".
Cómo podrás ver, el código es realmente similar al de la versión C# que hicimos en el post anterior, con esto quiero demostrar que resulta relativamente fácil portar un programa de un lenguaje a otro, ahora solo queda pendiente la versión para android, pero eso será la semana que viene. Cómo siempre, el código completo lo puedes descargar de mi dropbox, pero además la versión online también esta disponible para su ejecución en este blog.
Por ahora es todo. Los leo luego.
5/11/2017 05:38:00 p.m.
basic html
,
Basics
,
binario
,
Convertidor de bases
,
CSS
,
estilos css
,
hexadecimal
,
how to
,
octal
,
programacion
,
ternario
Vamos a programar #35 - DecToAny.
Hola de nuevo a todos, el día de hoy vamos a ver código en C# que se encargará de convertir de un número decimal a cualquier base (en realidad hasta base 20). Al igual que en las ocasiones anteriores, gran parte del código, será una adaptación de lo que hemos hecho en post anteriores.
Haciendo un poco de memoria.
Para empezar recordemos que las conversión de un número decimal a un número en otra base, se realiza mediante divisiones sucesivas de el numero resultante de la división anterior entre la base. Si tenemos el numero X decimal y lo queremos pasar a la base B, debemos de dividir X/B y al resultado R, en la siguiente división lo dividiremos entre la base (B), este proceso se repite mientras que el resultado R sea mayor que la base.
Portando el código a c#.
Sabiendo lo anterior, podemos crear una funcion cómo la que sigue:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DecToAny
{
public partial class FrmMain : Form
{
private List<TextBox> TextBoxes = new List<TextBox>();
private List<int> DecToAny(int Number, int Base)
{
int LastNumber = Number;
int Garbage;
List<int> result = new List<int>();
if (LastNumber < Base)
{
result.Add(LastNumber);
}
else
{
while (LastNumber >= Base) {
Garbage = LastNumber % Base;
LastNumber = LastNumber / Base;
if (LastNumber < Base)
{
result.Add(Garbage);
result.Add(LastNumber);
}
else
{
result.Add(Garbage);
}
}
}
return result;
}
private string ListToString(List<int> Lista)
{
string Out = "";
Lista.Reverse();
foreach (int Numero in Lista) {
if (Numero < 10)
{
Out += Numero.ToString();
}
else
{
Out += NumberToLetra(Numero);
}
}
return Out;
}
public FrmMain()
{
InitializeComponent();
}
private char NumberToLetra(int Number)
{
return (char)(Number + 55);
}
private void FrmMain_Load(object sender, EventArgs e)
{
TextBoxes.Add(txtBase2);
TextBoxes.Add(txtBase3);
TextBoxes.Add(txtBase4);
TextBoxes.Add(txtBase5);
TextBoxes.Add(txtBase6);
TextBoxes.Add(txtBase7);
TextBoxes.Add(txtBase8);
TextBoxes.Add(txtBase9);
TextBoxes.Add(txtBase10);
TextBoxes.Add(txtBase11);
TextBoxes.Add(txtBase12);
TextBoxes.Add(txtBase13);
TextBoxes.Add(txtBase14);
TextBoxes.Add(txtBase15);
TextBoxes.Add(txtBase16);
TextBoxes.Add(txtBase17);
TextBoxes.Add(txtBase18);
TextBoxes.Add(txtBase19);
TextBoxes.Add(txtBase20);
}
private void BtnConvert_Click(object sender, EventArgs e)
{
for (int T = 0; T < TextBoxes.Count; T++)
{
TextBoxes[T].Text = ListToString(DecToAny(int.Parse(TxtNIn.Text), (T + 2)));
}
}
}
}
El código anterior consta de 3 funciones. La función que hace gran parte del trabajo es "DecToAny", en ella se crean dos variables. La variable "LastNumber" será la encargada de almacenar el resultado de las divisiones anteriores. La variable "Garbage" será utilizada para guardar los "residuos" de las divisiones, estos son usados para formar el número final. Antes de siquiera empezar con el ciclo while, se hace una comprobación; si el número es menor que la base, simplemente se regresa una lista del tipo "int" con un solo elemento, en este caso, el mismo numero que se ingreso cómo parámetro para "Number". Si por el contrario el numero es igual o mayor que la base; se entra en el bucle while y se comienzan a hacer las divisiones. En el bucle, se comprueba que el resultado de la división que esta almacenado en "LastNumber" sea mayor que la base. Cuando la base es mayor que el resultado de la división, el residuo de esta se agrega a la lista "result", pero cuando la condición ya no se cumple, entonces agrega a la misma lista el valor residual de la división y además el resultado de la misma. Finalmente devuelve una lista del tipo "int" con todos los valores.
La funcion "ListToString" se usa para convertir la lista del tipo "int" en un string (valga la redundancia). Para empezar, primero se invierte el orden en el cual están los elementos, hay que recordar que el resultado de las divisiones se usa en orden inverso en donde el primer digito, sera el residuo de la ultima division seguido del resultado entero de la misma seguido de los residuos del resto de las otras divisiones. Para devolver el resultado final, tambien se hace uso interno de la funcion "NumberToLetra", hay que recordar que para el decimo digito se usa la letra A.
Una vez que se ejecuta la función "DecToAny" hay que pasársela cómo parámetro a la función "ListToString" y el resultado será un string con una cadena equivalente al numero en la base especificada.
Entonces la base más grande que podemos usar es 35, pero eso solo para mantener humanamente legible cualquier número,pero podríamos seguir con el siguiente carácter ascii (que es el que usamos) y así el número Z0 sera algo totalmente diferente a z0.
Cómo de costumbre el código fuente completo lo puedes descargar de mi dropbox.
Por ahora es todo, los leo luego
La funcion "ListToString" se usa para convertir la lista del tipo "int" en un string (valga la redundancia). Para empezar, primero se invierte el orden en el cual están los elementos, hay que recordar que el resultado de las divisiones se usa en orden inverso en donde el primer digito, sera el residuo de la ultima division seguido del resultado entero de la misma seguido de los residuos del resto de las otras divisiones. Para devolver el resultado final, tambien se hace uso interno de la funcion "NumberToLetra", hay que recordar que para el decimo digito se usa la letra A.
Una vez que se ejecuta la función "DecToAny" hay que pasársela cómo parámetro a la función "ListToString" y el resultado será un string con una cadena equivalente al numero en la base especificada.
A tomar en cuenta.
Algo muy importante a tomar en cuenta es que las letras que se usan representan los valores más allá del decimo digito. Para el decimo digito usamos la A y asi sucesivamente hasta la Z (incluso más) La siguiente tabla muestra los valores disponibles.
| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
Cómo de costumbre el código fuente completo lo puedes descargar de mi dropbox.
Por ahora es todo, los leo luego
5/04/2017 05:04:00 p.m.
Basics
,
binario
,
csharp
,
decimal
,
depuracion
,
hexadecimal
,
how to
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:
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.
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.
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.
- 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.
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) |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
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:
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
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.
| 2^7 (128) | 2^6 (64) | 2^5 (32) | 2^4 (16) | 2^3 (8) | 2^2 (4) | 2^1 (2) | 2^0 (1) |
|---|---|---|---|---|---|---|---|
| 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
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) |
|---|---|
| F | F |
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.
4/20/2017 05:33:00 p.m.
Basics
,
binario
,
decimal
,
hexadecimal
,
octal
Suscribirse a:
Entradas
(
Atom
)















































