¿Cómo convertiría un número binario en un número decimal en la menor complejidad de tiempo?

Convertir un número binario a decimal es muy fácil,

Paso 1: Obtenga el bit más adecuado y verifique si está configurado o no.
Para obtener el bit más a la derecha, modifique el número por 10. (número% 10) .

Paso 2:
Si se establece el bit más a la derecha, obtenga el valor correspondiente de esa posición utilizando la fórmula
Math.pow (2, indexPosition) y añádelo a la suma variable.

Si el bit más a la derecha no está configurado, entonces no es necesario hacer nada y no se agregará ningún valor a la suma variable.

Paso 3: Después de marcar el bit más a la derecha, divida el número por 10 para obtener el número restante para la próxima iteración. También Incremento indexPosition.
(número / 10) e indexPosition ++.

Continúe hasta que el número sea> 0.

Explicación detallada con el programa: Convertir número binario a decimal

Esta no es realmente la respuesta a su pregunta.

La respuesta proporcionada por Lukas Schmidinger es la respuesta precisa hasta ahora.

Pensé que podría interesarte conocer un método más corto para convertir binarios basado en el mismo concepto.

En el siguiente ejemplo, tomemos el 1010 binario por conveniencia.

De acuerdo con esos pasos, podemos convertir fácilmente el binario 0011.

Aquí puede eliminar los 0 dígitos binarios anteriores. Entonces te quedas con el binario 11

Por lo tanto

paso 1: – 1 x 2 = 2

paso 2: – 2 + 1 = 3

Entonces te queda la respuesta en decimal 3

La complejidad será O (n), donde n es el número de dígitos a convertir; no hay razón para una mayor complejidad, pero no veo cómo puedes mejorar.

Aquí está la respuesta general para leer números en cualquier base (suponga que tiene una cadena de caracteres de dígitos):

Accum = 0
Si bien hay otro dígito,
Accum = Accum * size_of_base
Accum = Accum + Valor del dígito
Avanzar al siguiente dígito

El resultado ahora se almacena en Accum. Para producir una cadena de dígitos en cualquier base deseada, vaya en la dirección inversa.

Mientras Accum> 0,
N = Mod de Accum size_of_base
Digit_string = Digit_string + String (N)
Accum = Floor (Accum / size_of_base)
Ahora, invierta esta cadena de dígitos.

Para convertir a cualquier radix N, divida el número entre N guardando el resto R. Repita hasta que el número original se reduzca a cero. La serie de números R que se producen son los dígitos del número original pero en orden inverso de derecha a izquierda. Es decir, 1234 aparecería como 4,3,2 y luego 1. Almacénelos en una matriz y luego imprímalos en el orden correcto, o escriba el procedimiento anterior en una función recursiva que los imprima a medida que se encuentran, pero la recursividad los imprimirá en el orden correcto.

Para acelerar esto, en el caso de decimales, divida por la potencia más grande de 10 que permitirá la representación numérica del número. Para un int32 use 10 ^ 9 para int64 use 10 ^ 18.

En binario, todo está en potencias de 2. Eso significa que el primer valor de posición es 1s, o 2 ^ 0, el segundo es 2s, o 2 ^ 1s, el tercero es 4s, o 2 ^ 2s, etc. En su ejemplo , el primer dígito en el lugar de las unidades es 1 = 2, y el dígito en el lugar de los dos es uno = 2. El número combinado = 2 + 1 = 3.

Si tuviera 0111 en binario, entonces sería 4 + 2 + 1 = 7. Los valores de lugar aumentan con potencias de 2, no 10.

Una buena manera de comenzar es convertir primero los números binarios en números octales:

El número binario 110010111, por ejemplo, se agrupa tres dígitos binarios a la vez:

110 010 111 representa 627 en el sistema octal. Cada bit binario, en el grupo de tres, se convierte de la misma manera que un número decimal usando dos en lugar de diez:

110 = 1 (2) ^ 2 + 1 (2) ^ 1 + 0 (2) ^ 0 = 4 + 2 + 0 = 6 —fácil de memorizar:

000 001 010 011 100 101 110 111 = 0 1 2 3 4 5 6 7

Una vez que haya convertido de binario a octal, luego convierta de octal a decimal utilizando la misma conversión de valor posicional: 627 octal = 6 (8) ^ 2 +2 (8) ^ 1 +7 (8) ^ 0 =

6 * 64 + 2 * 8 +7 = 384 +16 +7 = 407 decimal

Puede comenzar eliminando los ceros iniciales; No importan.

Entonces el problema se convierte en convertir [math] 11_2 [/ math] a base 10.

Tenga en cuenta que [math] 10_2 [/ math] es uno menos que [math] 11_2 [/ math]. ([matemáticas] 10_2 + 1 = 11_2 [/ matemáticas])

Convertir a base 10: [matemáticas] 10_2 = 2_10 = 2 [/ matemáticas]

2 + 1 = 3.

Bueno, cuenta la longitud de tu cadena binaria, aquí tenemos 4.

Entonces, si su binario de izquierda a derecha es [matemática] x_ {1} x_ {2} \ cdots x_ {n} [/ matemática] simplemente calcule [matemática] x_ {1} \ cdot 2 ^ {n-1} + x_ {2} \ cdot 2 ^ {n-2} + \ cdots + x_ {n} \ cdot 2 ^ 0 = x_ {1} \ cdot 2 ^ {n-1} + x_ {2} \ cdot 2 ^ {n -2} + \ cdots + x_ {n} [/ math]

Entonces aquí tenemos [matemática] 0 \ cdot 2 ^ 3 + 0 \ cdot 2 ^ 2 + 1 \ cdot 2 ^ 1 + 1 \ cdot 2 ^ 0 = 3 [/ math].

0011

= 11

= 2power1 + 1

= 2 + 1

= 3