Sep 25

Convertir un entero base 10 a binario en Java (Recursivo)

Etiquetas: Algoritmos, Java Versión para imprimir Pablo

En este ejemplo tenemos una aplicación simple que pide un número y lo convierte a binario utilizando un algoritmo recursivo con una variable externa.

Lo primero que tenemos que saber es cómo convertir un número de base 10 a binario, (base 2). Para ello, se divide el número deseado entre 2 y cada resultado de la división tantas veces como sea necesario hasta obtener el número indivisible, el 1. Luego se toman el último resultado, 1 y todos los restos de las divisiones, viendo la imagen va a quedar mucho más claro el concepto.
Divisiones necesarias para convertir un número a binario

A continuación veremos el código en Java necesario para pedir el número en base 10 y devolverlo en binario, por supuesto que se pueden agregar validaciones, de hecho hay que agregar validaciones para asegurarnos que el usuario ingrese un número, pero ese no es el objetivo de este post.

import java.io.BufferedReader;
import java.io.InputStreamReader;
 
class binario
{
	public static void main(String[] args)
	{
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader rdr = new BufferedReader(isr);
		System.out.print("Ingrese un número entero: ");
		String buffer = "0";
		try
		{
			buffer = rdr.readLine();
		}
		catch(java.io.IOException e) // Es obligatorio manejar la IOException, si se omite no compila
		{
			System.out.println(e);
		}
 
		int dec = Integer.parseInt(buffer);
		System.out.print("El valor binario correspondiente es: ");
 
		if(dec == 0)
			System.out.println(dec); // Cero en cualquier base es cero
		else
			System.out.println(obtenerBinario(dec)); // llamamos a la func. recursiva
	}
 
 
	static String aux = ""; // variable auxiliar utilizada para almacenar el resto de cada división
 
	static String obtenerBinario(int decimal)
	{
		if(decimal == 1) // Límite de la recursividad
			return Integer.toString(decimal) + aux; // Devolvemos 1 y los restos anteriores
		else
		{
			aux = aux + Integer.toString(decimal % 2); //guardamos el resto en la variable auxiliar
			return obtenerBinario(decimal / 2); // hacemos el llamado recursivo con el resultado de la división
		}
	}
}

Además del algoritmo para convertir los números, vale la pena ver la forma en que se lee la entrada estándar, utilizando un BufferedReader, pero eso lo veremos con mayor profundidad en otro post.

También te puede interesar:

Comentarios[10]

  1. LekNo Gravatar

    ¿Es cosa mía o el límite de recursividad debería ser “decimal <= 1“? En caso contrario, un número no lo muestra nunca.

  2. Josto colNo Gravatar

    exelente manito todo bien…….

  3. RossinaNo Gravatar

    Esto está super interesante.Aunque no me guste la matematica pero bueno tengo que estudiar Gracias x la información

  4. PabloNo Gravatar

    @Rossina: A veces tenemos que aprender cosas que no nos gustan para poder dominar otras que si…

  5. MarkosNo Gravatar

    Está mal, porque los restos tienen que ser ordenados al revés, es decir, debería de ser:
    else{
    aux = Integer.toString(decimal % 2) + aux;
    return obtenerBinario(decimal / 2);
    }

  6. aldoNo Gravatar

    [comentario editado por utilizar palabras fuera de lugar]
    solo manda las exception a todo lo que da

  7. PabloNo Gravatar

    @aldo: a mi me funciona bien, creo que tendrías que hacer un debug para ver que es lo que ocurre, o al menos escribe en un comentario los mensajes que te tira al compilar.

    Por favor, no utilices el vocabulario del comentario anterior, hay otras formas de decir las cosas.

  8. SantiagoNo Gravatar

    Hola el programa tiene un error con los numeros 5 y 6, arroja los resultados alrevez

  9. SantiagoNo Gravatar

    Ya arregle tu programa, el error esta aqui:
    aux = aux + Integer.toString(decimal % 2);
    deberia ser asi:
    aux = Integer.toString(decimal % 2)+ aux;

    Saludos…

  10. PabloNo Gravatar

    @Santiago y @Markos: gracias!! Confieso que no hice mucho testing en este ejemplo.

Deja un comentario