jueves, 30 de junio de 2011

ANSI C: Sistema binario y operaciones binarias

La mejor manera de demostrar el entendimiento sobre un tema, es explicándolo en términos sencillos. Debido a esto, para abordar el tema del Sistema Binario y algunas de sus operaciones más importantes, decidí realizar el siguiente mini tutorial dividido en 5 lecciones. Este tutorial, aunque contiene en su mayoría texto, decidí realizarlo como si fuera un programa, con el objetivo de practicar el uso del editor emacs en Linux, que es el editor utilizado durante el curso de verano de ANSI C y practicar la sintaxis y estructura del lenguaje.

Una vez compilado el código, obtendremos la siguiente salida en la terminal:

******************************************
Aprendiendo el idioma de las computadoras
******************************************
Bienvenido!! Aqui podras aprender acerca del
idioma que utilizan las computadoras para interpretar
el mundo que nos rodea.


LECCION 1: QUE ES EL SISTEMA BINARIO

Podria decirse que el sistema binario es el idioma
que hablan las computadoras. A traves de este idioma
las computadoras interpretan el mundo que nos rodea.

En que consiste este idioma?
Una computadora contiene muchos circuitos electronicos
en su interior. Estos circuitos solamente pueden hacer
dos cosas: apagarse o encenderse, por lo tanto, 
a la computadora le basta saber dos simbolos: uno que
represente a "apagado"y otro para representar
a "encendido".

Los dos simbolos que forman el idioma de las computadoras
son el cero y el uno. Asi de sencillo!!!


Sabias que...
El primer registro de la palabra "computador" data de 1613
y se referia a la persona que realizaba calculos.


LECCION 2: COMO VE LOS NUMEROS LA COMPUTADORA

Si solamente pudieras utilizar unos y ceros para contar,
como le harias? Este es un dilema al que se enfrentan
nuestras computadoras todos los dias de sus vidas.
Y aunque parezca algo muy dificil, escribir numeros con
unos y ceros es casi lo mismo que escribir los numeros
como estamos acostumbrados.

Los numeros que utilizamos de manera cotidiana estan formados
por diez digitos: 0,1,2,3,4,5,6,7,8 y 9.
El sistema binario solamente tiene dos digitos: 0 y 1.
Cuando contamos con nuestros diez digitos, despues del 9
escribimos un 1 y colocamos un 0 a la derecha para formar
el numero que le sigue a 9.
Con el sistema binario ocurre lo mismo: cuando llegamos al 1
y como no existe el 2, volvemos a escribir 1 seguido
 de un 0 a la derecha. Asi se representan el 0, 1, 2 y 3 que conocemos
en el sistema binario:
Decimal Binario
0 0
1 1
2 10
3 11

Como te imaginas que se representa entonces el 4?
En este punto ya volvimos a usar nuestras dos cifras,
por lo tanto, volvemos a colocar el 1, pero esta vez
seguido por dos ceros para representar al 4: 100.
Asi se representan el 4, 5, 6 y 7 en binario:
Decimal Binario
4 100
5 101
6 110
7 111

Puedes adivinar como se escribe entonces el 8?
Pues el 8 se escribe asi: 1000. Los numeros que le siguen
se escriben como si comenzara a entrar un 1 por la derecha
y se detuviera hasta encontrarse con el 1 original.

Pero que pasaria si solamente pudieras ver el numero
cuando esta escrito en binario? Como lo cambiarias a decimal?
Cuando aprendemos a contar olvidamos que todos los numeros
se pueden representar como sumas de numeros mas pequenios,
por ejemplo: 123 = 100 + 20 + 3
Ahora bien, 100 se puede ver tambien de la siguiente manera: 
100 = 1 x 10 x 10. La multiplicacion de 10 x 10 es lo mismo que
elevar el 10 a la potencia 2. Igualmente, 20 tambien se escribe
como una multiplicacion de 10: 20 = 2 x 10. El 10 solito es
lo mismo que elevar el 10 a la potencia 1. Finalmente, el 3
es: 3 x el 10 elevado a la potencia 0, pero como todo numero
elevado a la potencia 0 es siempre 1, entonces nos queda 3 x 1.
La razon por la que utilizamos 10 es porque nuestro sistema decimal
esta formado por 10 digitos. Entonces, en el sistema binario, en vez
de utilizar el 10, utilizamos el 2 de la misma manera. Asi, si
tuvieramos este numero binario: 1001, podemos saber cual es su
representacion decimal a traves de sumas y multiplicaciones con 2:
1001 = 1 x 2 elevado a la potencia 3 + 
       0 x 2 elevado a la potencia 2 + 
       0 x 2 elevado a la potencia 1 + 
       1 x 2 elevado a la potencia 0

Es decir: 1001 = 1 x 8  +  0 x 4  +  0 x 2  +  1 x 1 = 8 + 1 = 9

Ahora te toca a ti:
Ejercicio 1: Como se representa el 1256 en binario?
Ejercicio 2: Como se representa el 1110001 en decimal?


LECCION 3: COMO VE LAS LETRAS LA COMPUTADORA

En la leccion anterior observamos la forma en que la
computadora ve los numeros que ocupamos en nuestro sistema
decimal. Ahora sabremos como puede interpretar nuestras letras.
Si recordamos que la computadora solamente "conoce"
ceros y unos, entonces, como puede entender una letra?
Pues bien, para que una computadora pueda entender una letra
es necesario que esta se convierta en un numero decimal,
y como ya sabemos transformar decimales a binarios,
al llegar a este punto podemos decir que entonces conocemos
la representacion de una letra en la computadora.
Los numeros decimales que representan a una letra, estan definidos
dentro de un estandar llamado codigo ASCII. En internet se puede
encontrar la tabla de correspondencias para averiguar cuales son
los valores decimales que se utilizan para las letras. Por ejemplo:
consultando la tabla ASCII, observamos que la letra A (mayuscula)
se puede representar con el 65. Por lo tanto, cuando escribes
texto, y tecleas esta letra, lo que en realidad ve la computadora
es: 1000001, que es la representacion binaria de 65.

Ahora te toca a ti:
Ejercicio 3: Si tu fueras una computadora,
Como verias este grupo de letras?: H o L a
Consulta la tabla ASCII para obtener los valores necesarios.


LECCION 4: COMO MULTIPLICAR SIN MULTIPLICACION Y COMO DIVIDIR
SIN DIVISION

Observa que mientras mas grande sea un numero, su representacion
binaria es cada vez mas larga. Y mientras mas hacia la izquierda
se encuentra un digito, mayor sera su valor. Entonces, que pasa
cuando recorremos un numero binario hacia la izquierda en una
posicion y agregamos un cero en el extremo derecho para que ocupe
ese lugar que se recorrio? Observa con atencion:
Supongamos que tenemos el numero 4 en binario: 100 y ahora
recorremos todos sus digitos una posicion a la izquierda y ademas
agregamos un cero en el extremo derecho: 1000. Este nuevo numero
es el 8 en decimal que equivale a multiplicar 4 por 2. Entonces
al empujar un numero binario hacia la izquierda, lo que estamos
haciendo es duplicar ese numero tantas veces como hayamos recorrido
sus cifras a la izquierda, si por ejemplo recorremos el numero 1
(1 en binario) en dos posiciones a la izquierda obtendremos: 100
(4 en decimal) que equivale a duplicar el 1 dos veces, es decir:
1 x 2 x 2.

Haciendo corrimientos hacia la izquierda se puede duplicar un numero
binario. Te imaginas lo que pasa si los corrimientos los hacemos
hacia la derecha?. Como la derecha es el opuesto a la izquierda,
asi tambien ocurre lo opuesto al recorrer un numero binario a la
derecha: en lugar de aumentarle digitos, los eliminamos y en lugar
de multiplicar el resultado tantas veces sea necesario por 2, ahora
tendremos que dividir entre 2 el numero de veces que hayamos
recorrido nuestras cifras. Por ejemplo: el numero 8 en binario
es 1000, si recorremos estas cifras 2 veces hacia la derecha,
obtenemos 10, que es el 2 en decimal y que se obtiene al dividir
al 8 dos veces entre 2: 8/2 y el resultado otra vez entre 2.
Estas operaciones de recorrer cifras se conocen como Empujes y
tal como se vio, los empujes sirven para multiplicar o dividir
un numero de una manera poco convencional.

Ahora te toca a ti:
Ejercicio 4: Cual es el resultado de empujar al numero 14
3 posiciones hacia la izquierda?
Ejercicio 5: Cual es el resultado de empujar al numero 27
4 posiciones a la derecha?


LECCION 5: EXPLORANDO LA LOGICA DE LAS COMPUTADORAS

Existen otro tipo de operaciones que las computadoras pueden
realizar con los digitos de un numero binario. Estas operaciones
se llaman Operaciones Logicas Binarias. Se les llama logicas
porque trabajan con valores de verdadero y falso. Estos valores
tambien pueden ser representados mediante el 1 (para verdadero)
y el 0 (para falso).
La primera de ellas es el Y. Esta operacion tiene la caracteristica
de que solamente arroja como resultado el valor de verdadero cuando
trabaja con dos valores que tambien son verdaderos. En binario,
entonces el resultado solamente es 1 cuando los dos valores que
utiliza la operacion Y son 1 y 1. Como se realiza esta operacion?
Supongamos que tenemos el numero 110 y el numero 101, la operacion
Y compara digito a digito y produce un resultado dependiendo de sus
valores y comenzando de derecha a izquierda, asi: 110 & 101 arroja
como resultado: 100. El simbolo de esta operacion es el & (ampersand).

La segunda operacion es el O binario, que se representa con el simbolo
|, esta operacion arroja falso (es decir 0) solamente cuando ambos
valores son 0, en los demas casos, basta con que uno de ellos sea 1
para que obtengamos verdadero (es decir 1). Por ejemplo, si tenemos
los numeros 1001 y 1100 y realizamos la operacion de O entre ellos:
1001 | 1100 el resultado es: 1101.

La tercera operacion que analizaremos es la negacion o el NO.
Se representa con el simbolo: ~.
Esta operacion significa colocar el valor contrario
al valor que se tenga. Por ejemplo, para el numero 101, al
aplicar la negacion, el resultado es: 010. Observa que en esta
operacion no es necesario tener dos numeros para realizarla y que
es muy sencilla: cambia los 1s por 0s y los 0s por 1s.

Otra operacion es el llamado O exclusivo, representado por ^.
Con el O exclusivo, podemos obtener verdadero siempre y cuando
los valores a comparar sean diferentes, es decir sean 0 y 1.
Por ejemplo, teniendo los numeros 1010 y 0101, al aplicar el O
exclusivo obtendremos: 1010 ^ 0101 = 1111 puesto que
todas sus cifras son diferentes

Ahora te toca a ti:
Ejercicio 6: Realiza las cuatro operaciones logicas vistas
en esta leccion con los siguientes numeros y escribe su valor
en decimal: 11001101011, 1101110111


RESPUESTAS A LOS EJERCICIOS

Ejercicio 1: El numero 1256 en binario es 10011101000.
Ejercicio 2: El numero 1110001 en decimal es 113.
Ejercicio 3: Las letras H o L a se verian de la siguiente
manera: 1001000 1101111 1001100 1100001.
Ejercicio 4: 112
Ejercicio 5: 1
Ejercicio 6:
11001101011 = 1643
1101110111 = 887
1643 & 887 = 611
1643 | 887 = 1919
~1643 = 4294965652
~887 = 4294966408
1643 ^ 887 = 1308

El código fuente es el siguiente:


#include <stdio.h>


int main(int argc, char** args){

  printf("******************************************\n");
  printf("Aprendiendo el idioma de las computadoras\n");
  printf("******************************************\n");
  
  printf("Bienvenido!! Aqui podras aprender acerca del\n");
  printf("idioma que utilizan las computadoras para interpretar\n");
  printf("el mundo que nos rodea.\n\n\n");

  printf("LECCION 1: QUE ES EL SISTEMA BINARIO\n\n");
  printf("Podria decirse que el sistema binario es el idioma\n");
  printf("que hablan las computadoras. A traves de este idioma\n");
  printf("las computadoras interpretan el mundo que nos rodea.\n\n");
  printf("En que consiste este idioma?\n");
  printf("Una computadora contiene muchos circuitos electronicos\n");
  printf("en su interior. Estos circuitos solamente pueden hacer\n");
  printf("dos cosas: apagarse o encenderse, por lo tanto, \n");
  printf("a la computadora le basta saber dos simbolos: uno que\n");
  printf("represente a \"apagado\"y otro para representar\n");
  printf("a \"encendido\".\n\n");
  printf("Los dos simbolos que forman el idioma de las computadoras\n");
  printf("son el cero y el uno. Asi de sencillo!!!\n\n\n");

  printf("Sabias que...\n");
  printf("El primer registro de la palabra \"computador\" data de 1613\n");
  printf("y se referia a la persona que realizaba calculos.\n\n\n");

  printf("LECCION 2: COMO VE LOS NUMEROS LA COMPUTADORA\n\n");
  printf("Si solamente pudieras utilizar unos y ceros para contar,\n");
  printf("como le harias? Este es un dilema al que se enfrentan\n");
  printf("nuestras computadoras todos los dias de sus vidas.\n");
  printf("Y aunque parezca algo muy dificil, escribir numeros con\n");
  printf("unos y ceros es casi lo mismo que escribir los numeros\n");
  printf("como estamos acostumbrados.\n\n");

  printf("Los numeros que utilizamos de manera cotidiana estan formados\n");
  printf("por diez digitos: 0,1,2,3,4,5,6,7,8 y 9.\n");
  printf("El sistema binario solamente tiene dos digitos: 0 y 1.\n");
  printf("Cuando contamos con nuestros diez digitos, despues del 9\n");
  printf("escribimos un 1 y colocamos un 0 a la derecha para formar\n");
  printf("el numero que le sigue a 9.\n");
  printf("Con el sistema binario ocurre lo mismo: cuando llegamos al 1\n");
  printf("y como no existe el 2, volvemos a escribir 1 seguido\n ");
  printf("de un 0 a la derecha. Asi se representan el 0, 1, 2 y 3 que conocemos\n");
  printf("en el sistema binario:\n");
  printf("Decimal\tBinario\n");
  printf("0\t0\n");
  printf("1\t1\n");
  printf("2\t10\n");
  printf("3\t11\n\n");
  
  printf("Como te imaginas que se representa entonces el 4?\n");
  printf("En este punto ya volvimos a usar nuestras dos cifras,\n");
  printf("por lo tanto, volvemos a colocar el 1, pero esta vez\n");
  printf("seguido por dos ceros para representar al 4: 100.\n");
  printf("Asi se representan el 4, 5, 6 y 7 en binario:\n");

  printf("Decimal\tBinario\n");
  printf("4\t100\n");
  printf("5\t101\n");
  printf("6\t110\n");
  printf("7\t111\n\n");

  printf("Puedes adivinar como se escribe entonces el 8?\n");
  printf("Pues el 8 se escribe asi: 1000. Los numeros que le siguen\n");
  printf("se escriben como si comenzara a entrar un 1 por la derecha\n");
  printf("y se detuviera hasta encontrarse con el 1 original.\n\n");

  printf("Pero que pasaria si solamente pudieras ver el numero\n");
  printf("cuando esta escrito en binario? Como lo cambiarias a decimal?\n");
  printf("Cuando aprendemos a contar olvidamos que todos los numeros\n");
  printf("se pueden representar como sumas de numeros mas pequenios,\n");
  printf("por ejemplo: ");
  printf("123 = 100 + 20 + 3\n");
  printf("Ahora bien, 100 se puede ver tambien de la siguiente manera: \n");
  printf("100 = 1 x 10 x 10. La multiplicacion de 10 x 10 es lo mismo que\n");
  printf("elevar el 10 a la potencia 2. Igualmente, 20 tambien se escribe\n");
  printf("como una multiplicacion de 10: 20 = 2 x 10. El 10 solito es\n");
  printf("lo mismo que elevar el 10 a la potencia 1. Finalmente, el 3\n");
  printf("es: 3 x el 10 elevado a la potencia 0, pero como todo numero\n");
  printf("elevado a la potencia 0 es siempre 1, entonces nos queda 3 x 1.\n");
  printf("La razon por la que utilizamos 10 es porque nuestro sistema decimal\n");
  printf("esta formado por 10 digitos. Entonces, en el sistema binario, en vez\n");
  printf("de utilizar el 10, utilizamos el 2 de la misma manera. Asi, si\n");
  printf("tuvieramos este numero binario: 1001, podemos saber cual es su\n");
  printf("representacion decimal a traves de sumas y multiplicaciones con 2:\n");
  printf("1001 = 1 x 2 elevado a la potencia 3 + \n");
  printf("       0 x 2 elevado a la potencia 2 + \n");
  printf("       0 x 2 elevado a la potencia 1 + \n");
  printf("       1 x 2 elevado a la potencia 0\n\n");

  printf("Es decir: 1001 = 1 x 8  +  0 x 4  +  0 x 2  +  1 x 1 = 8 + 1 = 9\n\n");
  printf("Ahora te toca a ti:\n");
  printf("Ejercicio 1: Como se representa el 1256 en binario?\n");
  printf("Ejercicio 2: Como se representa el 1110001 en decimal?\n\n\n");

  printf("LECCION 3: COMO VE LAS LETRAS LA COMPUTADORA\n\n");
  printf("En la leccion anterior observamos la forma en que la\n");
  printf("computadora ve los numeros que ocupamos en nuestro sistema\n");
  printf("decimal. Ahora sabremos como puede interpretar nuestras letras.\n");
  printf("Si recordamos que la computadora solamente \"conoce\"\n");
  printf("ceros y unos, entonces, como puede entender una letra?\n");
  printf("Pues bien, para que una computadora pueda entender una letra\n");
  printf("es necesario que esta se convierta en un numero decimal,\n");
  printf("y como ya sabemos transformar decimales a binarios,\n");
  printf("al llegar a este punto podemos decir que entonces conocemos\n");
  printf("la representacion de una letra en la computadora.\n");
  printf("Los numeros decimales que representan a una letra, estan definidos\n");
  printf("dentro de un estandar llamado codigo ASCII. En internet se puede\n");
  printf("encontrar la tabla de correspondencias para averiguar cuales son\n");
  printf("los valores decimales que se utilizan para las letras. Por ejemplo:\n");
  printf("consultando la tabla ASCII, observamos que la letra A (mayuscula)\n");
  printf("se puede representar con el 65. Por lo tanto, cuando escribes\n");
  printf("texto, y tecleas esta letra, lo que en realidad ve la computadora\n");
  printf("es: 1000001, que es la representacion binaria de 65.\n\n");

  printf("Ahora te toca a ti:\n");
  printf("Ejercicio 3: Si tu fueras una computadora,\n");
  printf("Como verias este grupo de letras?: H o L a\n");
  printf("Consulta la tabla ASCII para obtener los valores necesarios.\n\n\n");

  printf("LECCION 4: COMO MULTIPLICAR SIN MULTIPLICACION Y COMO DIVIDIR\n");
  printf("SIN DIVISION\n\n");

  printf("Observa que mientras mas grande sea un numero, su representacion\n");
  printf("binaria es cada vez mas larga. Y mientras mas hacia la izquierda\n");
  printf("se encuentra un digito, mayor sera su valor. Entonces, que pasa\n");
  printf("cuando recorremos un numero binario hacia la izquierda en una\n");
  printf("posicion y agregamos un cero en el extremo derecho para que ocupe\n");
  printf("ese lugar que se recorrio? Observa con atencion:\n");
  printf("Supongamos que tenemos el numero 4 en binario: 100 y ahora\n");
  printf("recorremos todos sus digitos una posicion a la izquierda y ademas\n");
  printf("agregamos un cero en el extremo derecho: 1000. Este nuevo numero\n");
  printf("es el 8 en decimal que equivale a multiplicar 4 por 2. Entonces\n");
  printf("al empujar un numero binario hacia la izquierda, lo que estamos\n");
  printf("haciendo es duplicar ese numero tantas veces como hayamos recorrido\n");
  printf("sus cifras a la izquierda, si por ejemplo recorremos el numero 1\n");
  printf("(1 en binario) en dos posiciones a la izquierda obtendremos: 100\n");
  printf("(4 en decimal) que equivale a duplicar el 1 dos veces, es decir:\n");
  printf("1 x 2 x 2.\n\n");
  printf("Haciendo corrimientos hacia la izquierda se puede duplicar un numero\n");
  printf("binario. Te imaginas lo que pasa si los corrimientos los hacemos\n");
  printf("hacia la derecha?. Como la derecha es el opuesto a la izquierda,\n");
  printf("asi tambien ocurre lo opuesto al recorrer un numero binario a la\n");
  printf("derecha: en lugar de aumentarle digitos, los eliminamos y en lugar\n");
  printf("de multiplicar el resultado tantas veces sea necesario por 2, ahora\n");
  printf("tendremos que dividir entre 2 el numero de veces que hayamos\n");
  printf("recorrido nuestras cifras. Por ejemplo: el numero 8 en binario\n");
  printf("es 1000, si recorremos estas cifras 2 veces hacia la derecha,\n");
  printf("obtenemos 10, que es el 2 en decimal y que se obtiene al dividir\n");
  printf("al 8 dos veces entre 2: 8/2 y el resultado otra vez entre 2.\n");
  printf("Estas operaciones de recorrer cifras se conocen como Empujes y\n");
  printf("tal como se vio, los empujes sirven para multiplicar o dividir\n");
  printf("un numero de una manera poco convencional.\n\n");

  printf("Ahora te toca a ti:\n");
  printf("Ejercicio 4: Cual es el resultado de empujar al numero 14\n");
  printf("3 posiciones hacia la izquierda?\n");
  printf("Ejercicio 5: Cual es el resultado de empujar al numero 27\n");
  printf("4 posiciones a la derecha?\n\n\n");

  printf("LECCION 5: EXPLORANDO LA LOGICA DE LAS COMPUTADORAS\n\n");
  printf("Existen otro tipo de operaciones que las computadoras pueden\n");
  printf("realizar con los digitos de un numero binario. Estas operaciones\n");
  printf("se llaman Operaciones Logicas Binarias. Se les llama logicas\n");
  printf("porque trabajan con valores de verdadero y falso. Estos valores\n");
  printf("tambien pueden ser representados mediante el 1 (para verdadero)\n");
  printf("y el 0 (para falso).\n");
  printf("La primera de ellas es el Y. Esta operacion tiene la caracteristica\n");
  printf("de que solamente arroja como resultado el valor de verdadero cuando\n");
  printf("trabaja con dos valores que tambien son verdaderos. En binario,\n");
  printf("entonces el resultado solamente es 1 cuando los dos valores que\n");
  printf("utiliza la operacion Y son 1 y 1. Como se realiza esta operacion?\n");
  printf("Supongamos que tenemos el numero 110 y el numero 101, la operacion\n");
  printf("Y compara digito a digito y produce un resultado dependiendo de sus\n");
  printf("valores y comenzando de derecha a izquierda, asi: 110 & 101 arroja/n");
  printf("como resultado: 100. El simbolo de esta operacion es el & (ampersand).\n\n");

  printf("La segunda operacion es el O binario, que se representa con el simbolo\n");
  printf("|, esta operacion arroja falso (es decir 0) solamente cuando ambos\n");
  printf("valores son 0, en los demas casos, basta con que uno de ellos sea 1\n");
  printf("para que obtengamos verdadero (es decir 1). Por ejemplo, si tenemos\n");
  printf("los numeros 1001 y 1100 y realizamos la operacion de O entre ellos:\n");
  printf("1001 | 1100 el resultado es: 1101.\n\n");

  printf("La tercera operacion que analizaremos es la negacion o el NO.\n");
  printf("Se representa con el simbolo: ~.\n");
  printf("Esta operacion significa colocar el valor contrario\n");
  printf("al valor que se tenga. Por ejemplo, para el numero 101, al\n");
  printf("aplicar la negacion, el resultado es: 010. Observa que en esta\n");
  printf("operacion no es necesario tener dos numeros para realizarla y que\n");
  printf("es muy sencilla: cambia los 1s por 0s y los 0s por 1s.\n\n");

  printf("Otra operacion es el llamado O exclusivo, representado por ^.\n");
  printf("Con el O exclusivo, podemos obtener verdadero siempre y cuando\n");
  printf("los valores a comparar sean diferentes, es decir sean 0 y 1.\n");
  printf("Por ejemplo, teniendo los numeros 1010 y 0101, al aplicar el O\n");
  printf("exclusivo obtendremos: 1010 ^ 0101 = 1111 puesto que\n");
  printf("todas sus cifras son diferentes\n\n");

  printf("Ahora te toca a ti:\n");
  printf("Ejercicio 6: Realiza las cuatro operaciones logicas vistas\n");
  printf("en esta leccion con los siguientes numeros y escribe su valor\n");
  printf("en decimal: 11001101011, 1101110111\n\n\n");

  printf("RESPUESTAS A LOS EJERCICIOS\n\n");
  printf("Ejercicio 1: El numero 1256 en binario es 10011101000.\n");
  printf("Ejercicio 2: El numero 1110001 en decimal es 113.\n");
  printf("Ejercicio 3: Las letras H o L a se verian de la siguiente\n");
  printf("manera: 1001000 1101111 1001100 1100001.\n");
  printf("Ejercicio 4: %d\n", (14 << 3));
  printf("Ejercicio 5: %d\n", (27 >> 4));
  printf("Ejercicio 6:\n");
  printf("11001101011 = 1643\n");
  printf("1101110111 = 887\n");

  int a, b;
  a = 1643;
  b = 887;

  printf("%u & %u = %u\n", a, b, (a & b));
  printf("%u | %u = %u\n", a, b, (a | b));
  printf("~%u = %u\n", a, (~a));
  printf("~%u = %u\n", b, (~b));
  printf("%u ^ %u = %u\n", a, b, (a ^ b));

}

Referencias

"Computer." Wikipedia. The Free Encyclopedia. 2011

ASCII Table

Binary Number System.[Online] Available http://www.mathsisfun.com/binary-number-system.html, 2011.

Presentation 9: Binary System. [Online] Available https://sites.google.com/site/childrenandtechnology/presentation-9-binary-system

"Binary numeral system." Wikipedia. The Free Encyclopedia. 2011

ANSI C: Introducción

En este post iniciaremos un interesante recorrido para aprender aspectos básicos acerca del lenguaje ANSI C. Los posts publicados respecto a este tema se apegan al curso de verano que actualmente está impartiendo la Dra. Elisa Schaeffer en la Universidad Autónoma de Nuevo León.

De acuerdo con Wikipedia, se le llama ANSI C a la familia de estándares para el lenguaje C que ha publicado la ANSI (American National Standards Institute), organización no lucrativa encargada de supervisar la creación de estándares para productos, servicios, procesos, sistemas o personal en los Estados Unidos y a nivel mundial.

¿Por qué es importante utilizar un estándar para programar?

Un estándar es un consenso al que se ha llegado para poder estar de acuerdo con respecto a algo. En el caso de la programación, es importante que todos los programadores tengan un punto de referencia para poder crear programas que se comporten de la misma manera (o casi de la misma manera) sin importar el equipo o la región geográfica donde se ejecuten. Quizá esto no parezca gran cosa si se piensa en programas muy sencillos, pero en el desarrollo de sistemas que manejan gran cantidad de datos o que requieren de operaciones que involucran una gran precisión, saber exactamente cómo se espera que se comporten puede ser vital. Un par de ejemplos de lo anterior podrían ser las aplicaciones bancarias que trabajan con números muy grandes que representan el manejo del dinero de sus clientes donde un error en el manejo de estas cantidades podría representar pérdidas millonarias, o en la milicia, cuando se desea guiar un misil, la precisión en las coordenadas de su lanzamiento puede tener consecuencias mortales si éste termina cayendo en el punto equivocado

Si deseas saber más respecto a este curso, visita su página, donde además puedes encontrar material adicional y el código fuente que se explica en cada sesión.

sábado, 4 de junio de 2011

Problemas que se resuelven por sistemas de ecuaciones lineales

Tal vez una de las aplicaciones más importantes de los sistemas de ecuaciones lineales se encuentra en la resolución de problemas a través de éstos. Resolver un problema de esta naturaleza no es tarea sencilla, pero existen algunas consideraciones que pueden hacer esta tarea un poco más clara.

Para explicar estas consideraciones, utilizaré el siguiente ejemplo:

Un videoclub está especializado en películas de tres tipos: infantiles, oeste americano y terror. Se sabe que:

El 60% de las películas infantiles más el 50% de las del oeste representan el 30% del total de las películas.

El 20% de las infantiles más el 60% de las del oeste más del 60% de las de terror representan la mitad del total de las películas.

Hay 100 películas más del oeste que de infantiles.

Halla el número de películas de cada tipo.

1. Identificar las incógnitas para poder establecer el número de ecuaciones que se deben plantear para resolver el problema:

En este caso, se tienen tres incógnitas:

  1. Películas infantiles (que representaré con la letra “f”)
  2. Películas del oeste americano (letra “a”)
  3. Películas de terror (letra “r”)

Para representar las incógnitas es preferible elegir letras que no se confundan fácilmente con números.

Podemos ver en este caso que se trata de tres incógnitas, por lo tanto debemos plantear un sistema de tres ecuaciones.

2. Plantear las ecuaciones de acuerdo con la información proporcionada por el problema:

Empecemos a analizar el primer enunciado que proporciona información acerca del problema: “El 60% de las películas infantiles más el 50% de las del oeste representan el 30% del total de las películas”. Primero, para representar los porcentajes podemos utilizar fracciones (por ejemplo el 60% quedaría como 60/100 o su equivalente: 6/10) o decimales (el mismo 60% lo representaríamos como 0.6). En este caso yo elegí decimales, por lo que el 60% de las películas infantiles quedaría como 0.6f y el 50% de las del oeste quedaría como 0.5a (de acuerdo con las letras que elegí para representar cada tipo de película en el paso 1). Segundo, cuando se habla del total de algo, significa que se debe hacer una suma de elementos, en este caso, se habla del total de películas, eso quiere decir que todas las películas del videoclub están conformadas por la suma de películas infantiles, del oeste y de terror, es decir: el total de las películas es igual a f + a + r, como se especifica que se necesita el 30% de este total, entonces este 30% se representaría de esta manera: 0.3(f + a + r) por lo tanto, la primera ecuación la planteamos como sigue:

1) 0.6f + 0.5a = 0.3(f + a + r)

El segundo enunciado dice: “El 20% de las infantiles más el 60% de las del oeste más del 60% de las de terror representan la mitad del total de las películas”. Siguiendo la misma lógica, el 20% de las infantiles las representamos como 0.2f, el 60% de las del oeste como 0.6a y el 60% de las de terror como 0.6r. Ahora bien, cuando se hable de la mitad de algo, esto puede expresarse como ½ de algo, algo dividido entre dos, o en este caso interpretarlo como el 50% para ser consistentes en el planteamiento de la ecuación y evitar confusiones. Y como nuevamente se nos presenta el total de las películas, entonces la mitad del total de las películas lo representamos como: 0.5(f + a + r). Por lo tanto, la segunda ecuación del sistema es la siguiente:

2) 0.2f + 0.6a + 0.6r = 0.5(f + a + r)

El tercer enunciado dice: “Hay 100 películas más del oeste que de infantiles”. Este es un enunciado muy fácil de interpretar, únicamente quiere decir que para igualar el número de películas infantiles con el número de películas del oeste, por ejemplo, podemos sumar 100 a las infantiles, esto es:

3) a = f + 100

Y esta sería la tercera ecuación.

En resumen, nuestro sistema de ecuaciones sería este:

  1. 0.6f + 0.5a = 0.3(f + a + r)
  2. 0.2f + 0.6a + 0.6r = 0.5(f + a + r)
  3. a = f + 100

3. Resolver el sistema de ecuaciones planteado en el paso 2.

En este caso en la ecuación 3, ya tenemos una de las incógnitas (la letra “a”) igualada a algo (f + 100). Esta información se puede utilizar para sustituir a la letra “a” por “f + 100” en las otras dos ecuaciones y reducir el sistema de tres ecuaciones a un sistema de dos ecuaciones con dos incógnitas como a continuación:

  1. 0.6f + 0.5(f + 100) = 0.3(f + (f + 100) + r)
  2. 0.2f + 0.6(f + 100) + 0.6r = 0.5(f + (f + 100) + r)

Realizando las operaciones con “f + 100”:

  1. 0.6f + 0.5f + 50 = 0.3(2f + 100 + r)
  2. 0.2f + 0.6f + 60 + 0.6r = 0.5(2f + 100 + r)

Y finalmente realizando las multiplicaciones a la derecha del signo igual y reduciendo términos semejantes, obtenemos el siguiente sistema:

  1. 0.5f + 20 -0.3r = 0
  2. –0.2f + 10 + 0.1r = 0

Podemos realizar un despeje. Yo elegí a “r” de la ecuación 2:

r = (0.2f – 10)/0.1 (los paréntesis indican que tanto 0.2f como 10 se dividen entre 0.1)

Ahora bien, podemos aprovechar el hecho de que 0.1 = 1/10 para simplificar esta expresión:

r = (0.2f – 10)/(1/10) (usé paréntesis para evitar confusiones a la hora de escribir el 1/10)

Aplicando la regla “del sándwich”, entonces obtenemos que:

r = 2f – 100

Y si sustituimos a “r” en la ecuación 1 de nuestro sistema de dos ecuaciones tenemos:

0.5f + 20 – 0.3(2f – 100) = 0

Resolviendo las operaciones:

0.5f + 20 – 0.6f + 30 = 0

Y simplificando:

–0.1f + 50 = 0

Por lo tanto:

–0.1f = –50

Y finalmente:

f = –50/(–0.1)

f = –50/(–1/10) (teniendo en cuenta nuevamente que –0.1 = –1/10)

Nuevamente aplicando la regla “del sándwich”:

f = 500

Ahora sustituimos a “f” en r = 2f -100 y obtenemos a “r”:

r = 2(500) – 100

r = 1000 – 100

r = 900

Y también podemos obtener a “a” (de la ecuación 3 del sistema de ecuaciones original):

a = f + 100

a = 500 + 100

a = 600

4. Comprobar los resultados.

Ahora ya sabemos que:

f = 500

r = 900

a = 600

Podemos sustituir estos valores en las ecuaciones originales para comprobar que éstas se cumplen:

Para la primera ecuación:

0.6f + 0.5a = 0.3(f + a + r)

0.6(500) + 0.5(600) = 0.3(500 + 600 + 900)

0.6(500) + 0.5(600) = 0.3(2000)

Resolviendo las operaciones de multiplicación:

300 + 300 = 600

600 = 600

Por lo tanto, para la primera ecuación estos resultados son correctos. Ahora debemos verificar la siguiente:

0.2f + 0.6a + 0.6r = 0.5(f + a + r)

0.2(500) + 0.6(600) + 0.6(900) = 0.5(500 + 600 + 900)

0.2(500) + 0.6(600) + 0.6(900) = 0.5(2000)

Resolviendo las multiplicaciones:

100 + 360 + 540 = 1000

1000 = 1000

Por lo tanto con estos resultados, la segunda ecuación sí se cumple. Para la tercera ecuación tenemos entonces que:

a = f + 100

600 = 500 + 100

600 = 600

Podría parecer que esta última comprobación no es necesaria, sin embargo, la realicé debido a que SIEMPRE se deben comprobar todas las ecuaciones del sistema planteado.

5. Finalmente, una vez que comprobamos las soluciones y estamos seguros de que son correctas, entonces expresamos la respuesta al problema en forma de enunciado:

En el videoclub existen 500 películas infantiles, 600 películas del oeste americano y 900 películas de terror.