Cuando escribí la entrada anterior sobre cómo convertir decimal a binario en C olvidé escribir un nuevo post sobre hacer el proceso inverso, es decir, convertir binario a decimal en C.

Veamos cómo podemos convertir una cadena que representa a un número binario en su forma decimal. Por ejemplo, convertir “101011111011” en 2811.

Algoritmo para convertir binario a decimal en el lenguaje C

Para esto vamos a aplicar un poco de matemáticas y de trabajo con cadenas. Lo que haremos será recorrer la cadena binaria de derecha a izquierda.

Por cada posición (de derecha a izquierda, repito) hay un número por el que multiplicaremos. Primero es 1, luego 2, 4, 8 y así; doblando el valor en cada iteración. Realmente esto tiene una explicación más larga, cosa que explicamos en otro post.

Pero podemos simplificar más esto, ya que únicamente hay unos y ceros. Si es un uno, entonces sumamos el multiplicador, y si no, no hacemos nada (porque al multiplicar por 1 se obtiene el mismo número, y al multiplicar por 0 se obtiene 0).

En un ejemplo tenemos a 110. Recorremos de derecha a izquierda, tenemos al 0 y el multiplicador es 1. No hacemos nada.

Luego tenemos al 1, el multiplicador es 2 y por lo tanto sumamos 2. Finalmente tenemos a otro 1, el multiplicador es 4 y lo sumamos.

El resultado final será 5 en decimal. Así de simple.

Función que convierte binario a decimal en C

Pero basta de charlas; veamos a la función:

unsigned long long binarioADecimal(char *cadenaBinaria, int longitud) {
  unsigned long long decimal = 0;
  int multiplicador = 1;
  char caracterActual;
  for (int i = longitud - 1; i >= 0; i--) {
    caracterActual = cadenaBinaria[i];
    if (caracterActual == '1') {
      decimal += multiplicador;
    }
    multiplicador = multiplicador * 2;
  }
  return decimal;
}

Como ves recibe la cadena y la longitud de la misma; porque necesitamos recorrerla al revés. Leemos cada carácter y vemos si es 1, en caso de que sí, acumulamos en decimal lo que haya en multiplicador.

Independientemente del carácter, siempre aumentamos el multiplicador; o mejor dicho doblamos su valor.

Ah, por cierto, regresa un unsigned long long porque me parece que es el número más grande que se puede usar en C, ya que no sabemos cuál cadena binaria nos pasen y mejor prevenimos para regresar el mayor posible.

Recomiendo: invertir cadena en C.

Probar programa

Puedes probarlo así:

/*
    Algoritmo que convierte un número binario
    a uno decimal en C
    @author parzibyte
    Visita: parzibyte.me
*/#include <stdio.h>
#include <string.h>
#define LONGITUD_MAXIMA 1000
 
unsigned long long binarioADecimal(char *cadenaBinaria, int longitud);
 
int main() {
  // Esta primera parte tiene que ver con leer la entrada del usuario,
  // únicamente para demostrar
  char binario[LONGITUD_MAXIMA];
  printf("Introduce un número binario de hasta %d caracteres:\n",
         LONGITUD_MAXIMA - 1);
  fgets(binario, LONGITUD_MAXIMA, stdin);
  binario[strcspn(binario, "\r\n")] = 0;
 
  // Ahora sí aquí convertimos
  unsigned long long decimal = binarioADecimal(binario, strlen(binario));
  printf("El binario %s es %llu en decimal", binario, decimal);
  return 0;
}
 
unsigned long long binarioADecimal(char *cadenaBinaria, int longitud) {
  unsigned long long decimal = 0;
  int multiplicador = 1;
  char caracterActual;
  for (int i = longitud - 1; i >= 0; i--) {
    caracterActual = cadenaBinaria[i];
    if (caracterActual == '1') {
      decimal += multiplicador;
    }
    multiplicador = multiplicador * 2;
  }
  return decimal;
}

La función y la forma de leer la variable están separadas.

Digo esto para que no te confundas, ya que al leer la variable usamos fgets y quitamos el salto de línea para prevenir un desbordamiento de búfer.

Después de eso, calculamos la longitud con strlen que viene en string.h.

En mi caso probé con el número 11111111111111111111111 y salió esto:

Probar conversión binaria a decimal en C

Más tarde lo comprobé con mi conversor de números online y los resultados fueron iguales; es decir, correctos.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

2 días hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

1 semana hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

1 semana hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

1 semana hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

1 semana hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

1 semana hace

Esta web usa cookies.