jueves, 30 de junio de 2011

Tarea 1 Logaritmo de Booth

Pues  el algoritmo de Booth en C++ sirve para unas de  prácticas de la asignatura Teoría de autómatas y lenguajes formales y la verdad, aunque existe bastante información, eché en falta una explicación didáctica para comprender el procedimiento desde un punto de partida. Asi pues, en este artículo intentaré explicar el procedimiento del algoritmo lo mejor posible.
El algoritmo de Booth es un método rápido y sencillo para obtener el producto de dos números binarios con signo en notación completo de dos. 
Debemos saber que un número binario está formado por bits de ceros y unos, y que se puede traducir a decimal fácilmente de la siguiente forma:

binario bits






Sabiendo que la posición de cada bit es 2^n (elevado a n) y partimos de n=0 de derecha a izquierda, sólo queda realizar la suma total de multiplicar por dicho bit, en este caso, lo que muestro a continuación:
0·27+1·26+0·25+1·24+0·23+1·22+1·21+0·20 = 86.
También debemos saber que el complemento a uno de un número binario es cambiar sus ceros por unos, y sus unos por ceros (complementar): (010010 -> ca1: 101101) y que el complemento a dos de un número binario es el resultado de sumar 1 al complemento a uno de dicho número binario (NOTA: En el Ca1 sólo se complementa si el número es negativo):

binario ca1 ca2 complemento



Realizar una suma con dos números binarios es tarea fácil, pero la multiplicación resulta algo más complicada. Con el algoritmo de Booth, resulta mucho más sencillo de implementar. Partimos del ejemplo de la multiplicación 6·2=12:

binario booth


Como se puede ver en la imagen superior, partiendo de los números binarios de la multiplicación 6·2 (multiplicando y multiplicador) creamos tres nuevos números binarios del doble de tamaño (16 en el ejemplo): A, S y P.
Partiendo del número P (producto) comenzamos a comparar los últimos 2 bits de la derecha, siguiendo los casos base del recuadro:

binario booth




Se realizará esta comparación 8 veces en este ejemplo (número de bits de los operandos) y al final de cada comparación, realizamos un desplazamiento de un bit hacia la derecha, manteniendo el último bit de la izquierda, y descartando el último bit del lado contrario. Si hacemos una traza paso a paso nos quedarían los siguientes resultados:

algoritmo binario booth




Finalmente obtenemos el número en binario resultante (12 en este ejemplo), descartando el bit extra que hemos añadido al principio del procedimiento y que se encuentra en el extremo a la derecha.
Espero que esto les sirva tanto como me sirvió a mi en su momento.

Bueno aquí un pequeño programa de la multiplicación en binario de dos números

include< stdio.h>
#include< conio.h>
#include< process.h>
#include< math.h>

int get(int a)
{
char ch='B';
int flag=0;
if(a==1)
ch='A';
do
{
printf("│ ENTER VALUE OF %c: ",ch);
scanf("%d",&a);
if(a< 0)
{
a = a * -1;
flag = 1;
}
if(9< =a)
printf("│\n\t!INVALID NUMBER.ENTER VALUE (-9 < A < 9)!");
}while(9< =a);
if(flag)
a = a *-1;
return(a);
}

void add(int *a,int *b)
{
int x,i,c=0;
for(i=3;i>=0;i--)
{
x=a[i];
a[i]=c^x^b[i];
if(((c==1)&&(x==1))||((x==1)&&(b[i]==1…
c = 1;
else
c = 0;
}
}

void binary(int x,int*arr)
{
int i,p=x,c[4]={0,0,0,1};
for(i=0;i< 4;i++)
arr[i] = 0;
if(x < 0)
x = x *-1;
i = 3;
do
{
arr[i]=x%2;
x = x/2;
i--;
}while(x!=0);
if(p< 0)
{
for(i=0;i< 4;i++)
arr[i]=1-arr[i];
add(arr,c);
}
printf("\n\nTHE BINARY EQUIVALENT OF %d IS : ",p);
for(i=0;i< 4;i++)
printf("%d",arr[i]);
}

void rshift(int x,int *y)
{
int i;
for(i=3;i>0;i--)
y[i] = y[i-1];
y[0] = x;
}

void main()
{
int q=0,i,j,a,b,A[4]={0,0,0,0},C[4]={0,0,0,1…
int s=0,z=0,Q[4],M[4],temp,temp1[4],ans[8],y…
clrscr();
printf("\n│---------------------------…
a = get(1);
b=get(0);
printf("\n│---------------------------…
binary(a,M);
binary(b,Q);
printf("\n\n--------------------------…
printf(" OPERATION\t\t A\t Q\tQ'\t M");
printf("\n\n INITIAL\t\t");
for(i=0;i< 4;i++)
printf("%d",A[i]);
printf("\t");
for(i=0;i< 4;i++)
printf("%d",Q[i]);
printf("\t");
printf("%d\t",q);
for(i=0;i< 4;i++)
printf("%d",M[i]);
for(j=0;j< 4;j++)
{
if((Q[3]==0)&&(q==1))
{
printf("\n A:=A+M \t\t");
add(A,M);
for(i=0;i< 4;i++)
printf("%d",A[i]);
printf("\t");
for(i=0;i< 4;i++)
printf("%d",Q[i]);
printf("\t%d\t",q);
for(i=0;i< 4;i++)
printf("%d",M[i]);
}
if((Q[3]==1)&&(q==0))
{
printf("\n A:=A-M \t\t");
for(i=0;i< 4;i++)
temp1[i] = 1-M[i];
add(temp1,C);
add(A,temp1);
for(i=0;i< 4;i++)
printf("%d",A[i]);
printf("\t");
for(i=0;i< 4;i++)
printf("%d",Q[i]);
printf("\t%d\t",q);
for(i=0;i< 4;i++)
printf("%d",M[i]);
}
printf("\n Shift \t\t\t");
y = A[3];
q = Q[3];
rshift(A[0],A);
rshift(y,Q);
for(i=0;i< 4;i++)
printf("%d",A[i]);
printf("\t");
for(i=0;i< 4;i++)
printf("%d",Q[i]);
printf("\t");
printf("%d\t",q);
for(i=0;i< 4;i++)
printf("%d",M[i]);
}
printf("\n\n--------------------------…
printf("\nTHE ANSWER IN BINARY IS : ");
for(i=0;i< 4;i++)
ans[i]=A[i];
for(i=0;i< 4;i++)
ans[i+4]=Q[i];
if(((a< 0)&&(b>0))||((a>0)&&(b< 0)))
{
for(i=0;i< 8;i++)
ans[i]=1-ans[i];
for(i=7;i>=0;i--)
{
x = ans[i];
ans[i]=c^x^C1[i];
if(((c==1)&&(x==1))||((x==1)&&(C1[i]==…
c=1;
else
c=0;
}
}
for(i=0;i< 8;i++)
printf("%d",ans[i]);
for(i=7;i>=0;i--)
{
s = s + (pow(2,z) * ans[i]);
z = z+1;
}
if(((a< 0)&&(b>0))||((a>0)&&(b< 0)))
printf("\nTHE ANSWER IN DECIMAL IS : -%d\n",s);
else
printf("\nTHE ANSWER IN DECIMAL IS : %d\n",s);
getch();
}

Ejercicio (Puntos extras) -ALGORITMOS

miércoles, 29 de junio de 2011

Tarea 2 Operaciones Binarias

Les voy a explica como se realiza la suma en sistema binario, la suma binario es mas sencilla que en el sistema decimal se maneja el 0 1

para poder sumar en binario debes de recordar la siguiente tabla

0+0=0
0+1=1
1+0=1
1+1=10

el siguiente ejemplo

         1000                    
       +  101                      <=== 
       _______          
         1101    
                          se realiza de igual forma                del sistema decimal de derecha a izquierda


         1101
     +  1010
        _____             <=== 
        10111     


Cuando tenemos mas numeros como en el ejemplo lo vamos sumando en 2 en 2 columna por columna y de igual forma en el sistema decimal cuando se sobre pase es decir cuando tengamos 1+1=10 subimos una unidad para sumarla con la siguiente columna y ponemos el cero en el resultado a esto unidad se les llaman acarreos asi columna a columna se van sumando de 2 en 2 hasta llegar a la ultima donde ya es posible poner el 10

11 11  1<=== ACARREOS
  ^  ^   ^
  1   0  1  1
       1  0  1
  1   0  0  0
       1  1  0
       1  1  1
__________
 1  0 1 0 1


Resta



0-0=0
0-1=1
1-0=1
1-1=0

 11001
-  1000
  ______

   10001


Ejemplo:


Cuando tengamos la resta 0-1 se le pide prestada a la base que es 2 y se paga 1 a la siguiente unidad que es el sustraendo igual manera del sistema decimal te piden 10 y te pagan 1 asi como cada unidad sea menor que la del sustraendo a la unidad del minoendo se le suman 2 unidades y a la del sustraendo se le paga 1


Conversión de octal a binario

La ventaja principal del sistema de numeración octal es la facilidad con que se puede realizar la conversión entre números binarios y octales. La conversión de octal a binario se lleva a cabo conviniendo cada dígito octal en su equivalente binario dc 3 bits. Por medio de estas conversiones, cualquier número octal se conviene a binario, convirtiéndolo dc manera individual. Por ejemplo, podemos convertir 516, a binario de la siguiente manera:
5 1 6 

001 110 <====entonces

5168 = 1010011102

Conversion de binario a octal

La conversión de enteros binarios a octales es simplemente la operación inversa del proceso anterior. Los bits del número binario se agrupan en conjuntos de tres comenzando por el LSB. Luego, cada grupo se convierte a su equivalente octal. Por ejemplo: 111 001 101 110 7 1 5 6 entonces: 1110011011102 = 71568

Sistema De Numeración Hexadecimal

Conversión de hexadecimal a decimal.- Un número hexadecimal se puede convenir a su equivalente decimal utilizando el hecho de que cada posición de los dígitos hexadecimales tiene un valor que es una potencia de 16. El LSD tiene un valor de l60 = 1; el siguiente dígito en secuencia tiene un valor de 161 = 16; el siguiente tiene un valor de 162 = 256 y así sucesivamente.
Por ejemplo:

81216 = 8 x 162 + 1 x 161 + 2 x 160

81216 = 2048 + 16 + 2

81216 = 206610

Conversión de decimal a hexadecimal

Recuerde que efectuamos la conversión de decimal a binario por medio de la división repetida entre 2 y de decimal a octal por medio de la división repetida entre 8. De igual manera, la conversión de decimal a hexadecimal se puede efectuar por medio de la división repetida entre 16.
Por ejemplo:


con residuo 7 

con residuo 010

con residuo 1

42310 = 1A716 <====entonces

Conversión de hexadecimal a binario

Al igual que el sistema de numeración octal, el sistema hexadecimal se usa principalmente como método ‘taquigráfico” en la representación de números binarios. Es una tarea relativamente simple la de convertir un número hexadecimal en binario. Cada dígito hexadecimal se convierte en su equivalente binario de 4 bits.
Por ejemplo:

6 D 2 3 

1101 0010 0011                                            
                                                      
6D2316 = 1101101001000112                  <====entonces

Conversión de binario a hexadecimal
Esta conversión es exactamente la operación inversa del proceso anterior. El número binario se agrupa en conjuntos de cuatro bits y cada grupo se convierte a su dígito hexadecimal equivalente. Cuando es necesario se añaden ceros para completar un grupo de cuatro bits.

11101001102 = 0011 1010 0110

3 A 6

11101001102 = 3A616 

 Biblografias http://www.mitecnologico.com/Main/BinarioOctalYHexadecimalADecimal

lunes, 27 de junio de 2011

Tarea 1 - Lenguaje Anci - LA APLICABILIDAD Y UTILIDAD DE LENGUAJE ANSI C HOY EN DIA

El lenguaje C es un lenguaje de programación, es decir, es aquel lenguaje que utilizamos para que las computadoras hagan algo que nosotros los programadores le decimos que hagan. 

Lo que acabas de escribir es un código fuente, que es una serie de palabra y signos que se utilizan para programar, esto se colocan en lo que se llama "COMPILADORES", que son aquellos programas que convierten este código fuente en código binario que es el código que las computadoras entienden (1 y 0). El compilador transforma el código fuente en binario y realiza aquella acción que el código hace que realice, como abrir una ventana, ejecutar un sonido, abrir un archivo, realizar una suma, etc.

El código fuente del lenguaje de programación C se colocan en un compilador C, uno de ellos es el Microsoft C++.

Porque los lenguajes de programación?....Porque el código binario es muy difícil de aprender y a la vez muy tedioso y complicada a la hora de programar, por eso se crearon los lenguajes de programación, una forma mas sencilla de programar a través del propio lenguaje humano.

Los lenguajes de programación mas famosos son:
-Microsoft Basic
-Microsoft C++
-Java
-Entre otros



No esta en desuso para nada. El lenguage C sigue siendo a dia de hoy de los lenguajes más potentes y se usan para realizar cualquier operación matematica de altos costes, ya que puede llevarlos a cabo mucho mas rapido que otros. Además, se utiliza para muchos sistemas operativos UNIX (la inmensa mayoria de los servidores del mundo funcionan bajo sistemas UNIX), y estan presentes en muchas aplicaciones graficas, y con sus librerias.Además se utiliza para desarrollar compiladores. Por no mencionar, claro está, que aprendiendo C tienes toda la base de los lenguajes "visuales" mas utilizados hoy dia como Java o C#.net, y de la programación web como PHP