Java - Binario a Decimal utilizando Array

 
Vista:

Binario a Decimal utilizando Array

Publicado por Charlie (2 intervenciones) el 27/05/2020 19:53:42
Buenas tardes,

Recientemente me he iniciado en el mundillo de la programación, y he encontrado un ejercicio que no puedo resolver, llevo ya un total de 3-4 horas sin exagerar.

Agradecería la ayuda, dejo por aquí el enunciado del ejercicio. Gracias

Queremos hacer un programa que lea un número binario del teclado y calcule su valor en decimal.

- Guarde cada cifra en un array de ints.
- Recuerde que en la conversión a número decimal cada cifra tiene un peso :
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
-1
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Binario a Decimal utilizando Array

Publicado por Kabuto (1381 intervenciones) el 28/05/2020 18:50:56
Hola.

Lo primero que debes hacer es comprobar si tú mismo eres capaz de convertir un número binario a decimal.
Hablo de hacerlo con lápiz y papel, es decir, que tú sepas cuál es la lógica a seguir para hacer la conversión.
Será luego cuando puedas ponerte a pensar como transmitir esa lógica a un algortimo.

En este enlace se explica cómo hacer la conversión:
http://recursostic.educacion.es/secundaria/edad/4esotecnologia/quincena5/4q2_contenidos_2b.htm

Bien, si ya sabes como hacer tú la conversión, toca idear un algoritmo para transmitir esa lógica a la máquina.

Para hacer el ejercicio se nos pide que el número binario, tenga sus bits separados en un array de int. No es algo obligatorio, pero es lo que piden.

Podríamos pedirle al usuario que teclee las cifras del binario una a una, pero es muy poco práctico.
Creo que lo ideal es recoger el número binario completo de una sola vez y luego separar nosotros las cifras en un array.

Se podría leer el número binario en una variable int. Pero esto limita la longitud del binario que nos quiera dar el usuario y además, luego separar las cifras será más complejo.

Lo ideal es leer el binario en un objeto String.

1
2
3
4
5
6
public static void main(String[] args) {
    Scanner teclado = new Scanner(System.in);
 
    //Leemos el num binario en un String
    System.out.print("Introduce número binario: ");
    String binario = teclado.nextLine();

Ya tenemos un binario, ahora hay que separar sus bits, los 1 y 0, en un array de int.
Declaramos el array con el mismo tamaño que tiene el String.
Luego recorremos el String con un bucle y seleccionamos cada uno de esos caracteres para meterlos en el array.
Pero ojo, el String nos dará sus caracteres como valores tipo char (character), no nos da valores numéricos int.
Es decir, una cosa es el char '1' y otra cosa es el int 1. Se parecen, pero son cosas completamente distintas.

Tenemos que coger ese char y transformarlo al valor int que representa.
La clase Character ya nos facilita un método para hacer esta transformación, así que ha dicho método le pasamos el valor char y nos dará el valor int que necesitamos, listo para guardarlo en el array

1
2
3
4
//Separamos los bits del binario en un array de int
int[] bits = new int[binario.length()];
for (int j = 0; j < bits.length; j++)
    bits[j] = Character.getNumericValue(binario.charAt(j));

Bueno, hasta aquí la parte fácil. Ya tenemos un array de int con los bits 1 y 0 separados.
Toca hacer la conversión.

Aquí podrías hacer un nuevo intento de resolverlo por tu parte, ahora que ya tienes la forma de obtener un array de int con los bits del binario y también una explicación de cómo hacer la conversión.

Si tu intento falla, o directamente quieres saber la solución, sigue leyendo. Voy a intentar hacer una explicación y luego al final pondré el código final con la solución




Para convertir de binario a decimal, cosa que se supone que ya sabes hacer , hay que recorrer las cifras del binario y si es valor 1 se sustituye por la potencia de 2 correspondiente a su posición. (1, 2, 4, 8, 16, 32, 64, 128, ....)
Si es valor 0, se ignora, no vale nada.
Luego se suman las potencias que si hemos aplicado y esto nos da el valor decimal

Así que el proceso lógico es recorrer el array de int a la inversa, comenzando desde la última posición hasta el principio.
Preguntamos si es un valor 1, en caso afirmativo, aplicamos la potencia correspondiente a esta posición y la acumulamos en una variable int que al final del proceso tendrá el valor decimal equivalente.

Bien, recorrer el array a la inversa es fácil. Preguntar si la cifra es un 1, es aún más fácil.
¿Y aplicar la potencia de 2 correspondiente? Esto ya es más complicado.
¿Cómo hacemos que el algoritmo sepa si a una cifra le corresponde el 16, o el 32, o el 256...
Sí, depende de la posición, ¿pero cómo hacemos que el algoritmo relacione cada posición con su potencia equivalente?

Fijémonos en las potencias de base 2 que tenemos que aplicar:

2^0 = 1 (podemos pensar que es 0, y debería serlo, pero por convención matemática todo número potenciado a cero es 1)
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^5 = 32
etc...

Fíjate, la base siempre es 2, no varía. Solo varían los exponentes, y fíjate que son un progresión de números que se incrementan en 1: 0, 1, 2, 3, 4, 5,...

Esta progresión podemos crearla en el algoritmo usando una variable, podemos llamarla "exponente", que comience con valor 0 y se vaya incrementando al final de cada iteración del bucle que recorre las cifras.
Así el exponente se incrementa sincronizádamente con cada posición recorrida en el array, y siempre tendremos el exponente para la base 2 adecuado para acumular en la suma que nos dará el valor decimal.

Es un poco farragoso de explicar, quizás se entienda mejor, si vemos el código.
Lo pongo ya al completo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Convertir {
 
	public static void main(String[] args) {
		Scanner teclado = new Scanner(System.in);
 
		//Leemos el num binario en un String
		System.out.print("Introduce número binario: ");
		String binario = teclado.nextLine();
 
		//Separamos los bits del binario en un array de int
		int[] bits = new int[binario.length()];
		for (int i = 0; i < bits.length; i++)
			bits[i] = Character.getNumericValue(binario.charAt(i));
 
		//Ya tenemos los bits en un array de int,
		//ahora hay que calcular su valor decimal
 
		int exponente  = 0; //Exponente para la base 2, que irá incrementándose
		int valorDecimal = 0; //Aqui acumulamos el valor de cada bit que sumados nos dan el valor decimal
 
		for (int i = bits.length - 1; i >= 0; i--) { //Recorremos el array a la inversa, de fin a principio
			if (bits[i] == 1) //Es un 1, acumulamos la potencia de 2 correspondiente
				valorDecimal += Math.pow(2, exponente);
 
			exponente++; //Incrementamos exponente para la próxima cifra
		}
 
		System.out.println("\nValor decimal: " + valorDecimal);
 
	}
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Binario a Decimal utilizando Array

Publicado por Rodrigo (623 intervenciones) el 28/05/2020 22:40:26
Parece algo mejor hacer que exponente valga 1 inicialmente, sumar exponente cada vez que sea necesario (en vez del Math.pow) y hacer

exponente = 2 * exponente

en vez de incrementarlo en 1.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar