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.
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
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: