lunes, 11 de julio de 2011

Convertir de Decimal a Binario en Java

Este programa en Java recibe un entero decimal y lo convierte a binario. Hay varias formas de realizar esta conversión. En tanto preparo otras, aquí va esta versión.
El algoritmo consta de los siguientes pasos:

Expresar el número x como una combinación lineal de potencias de dos

x = a0*2⁰ + a1*2¹ + a2*2² + a3*2³ + .....

Y entonces, mientras x != 0 se hace lo siguiente
{
Si x es impar, entonces
el siguiente coeficiente ai es 1
se resta 1 a x
se divide x entre 2

Si x es par, entonces
el siguiente coeficiente ai es 0
se divide x entre 2

}

Tal vez un ejemplo sencillo sea más ilustrativo, sea x = 5
5 se puede expresar como:

5 = a0*2⁰ + a1*2¹ + a2*2² + a3*2³ + ....

como el numero x es impar, entonces a0 = 1
restando 1 en ambos lados de la ecuación se tiene

4 =  a1*2¹ + a2*2² + a3*2³ + ....

después se divide entre 2 ambos lados

2 = a1*2⁰ + a2*2¹ + a3*2² + ....

en este caso x es par, por lo cual a1 = 0 se divide todo entre 2 y queda

1 = a2*2⁰ + a3*2¹ +.....

en este caso x es impar, asi que a2 = 1
Se resta 1 en ambos lados y se cumple la condición de que el número x es 0. El
resultado es:

a0 = 1
a1 = 0
a2 = 1

y los otros coeficientes son cero. De esta forma se ha mostrado cómo convertir de decimal a binario el número 5. Éste es el algoritmo que se utiliza en el siguiente programa:

Éste archivo debe guardarse con el nombre: UsaConvertirBinario.java

import java.util.Scanner;

public class UsaConvertirBinario
{   // Abre clase UsaConvertirBinario

public static void main( String args[])
{    // Abre main

System.out.print("\nEste programa convierte decimales a ");
System.out.print("binario.\n");
Scanner entrada = new Scanner(System.in);
ConvertirBinario miObjeto = new ConvertirBinario();
int numero;

System.out.print("\nPor favor introduzca un numero ");
System.out.println("y se imprimira su equivalente en binario: ");

numero = entrada.nextInt();
miObjeto.Binario( numero );

 }    // Cierra main
 }   // Cierra clase UsaConvertirBinario

El siguiente código debe guardarse con el nombre: ConvertirBinario.java

public class ConvertirBinario
{   // Abre clase ConvertirBinario
/* La variable Tamano controla el numero de 
simbolos que se requieren para hacer la conversion
Para llevar un registro de los simbolos se usa un
arreglo. Estos se deben guardar porque se van generando
de derecha a izquierda, pero la impresion es de 
izquierda a derecha.*/

private int Tamano = 35;
/* La variable Tanamo se fija en 35, porque
los enteros en java son de 32 bits (4 bytes)
y ademas el ultimo se reserva para el signo
por lo tanto con 35 se cubre bien el rango*/
 
private int[] a = new int[Tamano];

/////////////////////////////////////
// METDODO BINARIO 
/////////////////////////////////////

public void Binario( int x )
{     // Abre metodo Binario 
System.out.println("\nAqui esta el numero en notacion binaria: ");

// Se llena el arreglo con ceros
for ( int i = 0; i < Tamano; i++ )
{  // Abre for
a[i] = 0;
}  // Cierra for

int j = 0;

while ( 0 != x )
{   // Abre while

if ( 0 != x % 2 )
{   // Abre if
a[j++] = x % 2; 

// Se resta el residuo
 x -= x % 2;

// Se divide entre 2
x /= 2;
}   // Cierra if

else 
{     // Abre else
a[j++] = 0; 

// Se cambia x
x /= 2;
}     // Cierra else

}   // Cierra while

/* El numero en binario, que se ha guardado
 en el arreglo, se manda a imprimir */

Imprimir();

}   // Cierra metodo Binario 



///////////////////////////////////
//METODO IMPRIMIR
///////////////////////////////////

public void Imprimir(  )
{      // Abre metodo Imprimir
/*El arreglo se imprime de la ultima posicion
a la primera. Sin embargo, es muy probable 
que las ultimas sean 0. Como estan a la derecha
no es necesario imprimirlos. La variable estatus
inicia con "afuera", lo cual indica que los ceros 
no deben imprimirse */

String estatus = "afuera";

for ( int i = Tamano - 1; i >= 0; i-- )

switch ( a[i] )
{       // Abre switch
case 0:
if ( "adentro" == estatus )
System.out.printf("0");
break;

case 1:
System.out.printf("1");
estatus = "adentro";
break;

default :
System.out.printf("ERROR. EL PROGRAMA ESTA MAL!");
break;
}       // Cierra switch

/* Es probable que se haya introducido el numero 0
y en este caso la variable estatus permanecio
como "afuera" y no se imprimio el 0.*/

if ( "afuera" == estatus )
System.out.printf("0");

System.out.println("\n");

}      // Cierra metodo Imprimir  

}    // Cierra clase ConvertirBinario


7 comentarios:

  1. no mustra la clase , solo el metodo ya hecho
    o estoy mal?

    ResponderEliminar
    Respuestas
    1. El programa consta de dos archivos, cada uno de los cuales contiene una clase. El primero de ellos es, por decirlo de una manera, el maestro. Contiene al método main en una clase que, por ponerle un nombre, le he llamado UsaConvertirBinario, y es desde donde se llama a los métodos que hacen la tarea, los cuales se encuentran en el segundo archivo, llamado ConvertirBinario.java. En ésta clase se encuentra un par de métodos, el primero, llamado Binario realiza la conversión con el algoritmo explicado arriba. El segundo se llama Imprimir, y es importante, porque las computadoras imprimen los números de izquierda a derecha, pero nosotros debemos imprimir sólo los elementos del arreglo a[] que son significativos, es decir, a partir del primero distinto de 0 que se encuentre en el recorrido de izquierda a derecha. Así que, respondiendo a tu pregunta, éste es un programa completo, en donde aparecen métodos y clases. Guárdalos en el mismo directorio, compila y ejecuta.
      Saludos.

      Eliminar
  2. Lo más fácil es hacer esto:

    public static void main(String[] args) throws IOException {

    int Num, res;
    int maxDivisor=1073741824; //Máximo factor divisorio entero
    int maxEntero=2147483647; //Máximo numero entero que se puede ingresar
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    Num = Integer.parseInt(in.readLine());
    System.out.print("El equivalente binario de "+Num+" es: ");
    while (maxDivisor>0)
    {
    res = Num / maxDivisor;
    System.out.print(res);
    Num = Num % maxDivisor;
    maxDivisor = maxDivisor / 2;
    }
    System.out.println("\n-Fin del Programa-");
    }

    ResponderEliminar
  3. Lo más fácil es hacer esto:

    public static void main(String[] args) throws IOException {

    int Num, res;
    int maxDivisor=1073741824; //Máximo factor divisorio entero
    int maxEntero=2147483647; //Máximo numero entero que se puede ingresar
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    System.out.print("Ingrese un numero: ");
    Num = Integer.parseInt(in.readLine());
    System.out.print("El equivalente binario de "+Num+" es: ");
    while (maxDivisor>0)
    {
    res = Num / maxDivisor;
    System.out.print(res);
    Num = Num % maxDivisor;
    maxDivisor = maxDivisor / 2;
    }
    System.out.println("\n-Fin del Programa-");
    }

    ResponderEliminar
  4. Me podrias explicar cada uno de los ciclos

    ResponderEliminar
  5. Solo acepta enteros, da error con decimales aparte de como declaras los atributos

    ResponderEliminar
  6. gracias pero no me sirvió de gran ayuda

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...