Convertir un binario a decimal en C

Muhammad Hashim Safder 12 octubre 2023
  1. Convertir binario a decimal en C
  2. Método 1: Convertir usando variables de bucle y enteras
  3. Método 2: Utilice un enfoque procedimental
  4. Método 3: use la matriz char para almacenar el número binario
Convertir un binario a decimal en C

Este artículo analiza exhaustivamente múltiples implementaciones de C para convertir números binarios en equivalentes decimales. Sin embargo, debemos buscar las bases de conversión inevitables antes de saltar a las implementaciones.

Convertir binario a decimal en C

Los números binarios pueden contener solo dos valores: 0 y 1. Sin embargo, la notación decimal tiene diez símbolos: del 0 al 9 (0,1,2,3,4,5,6,7,8,9).

La notación binaria (0,1) es nativa del hardware de la computadora, mientras que los valores decimales son los valores enteros que los humanos pueden entender fácilmente.

Método de conversión

El número binario 0101 equivale a 5 en decimal. El método de conversión de binario a decimal es bastante sencillo, como se describe en la siguiente fórmula:

$$ Equivalente decimal =\sum_{i=0}^{n-1}\left(B_{i} \times 2^{i}\right) $$

Aquí B es el número binario completo, y B_{i} representa el bit i^th^ en el número binario dado. La n representa el número total de bits en el número binario dado.

Apliquemos la fórmula anterior a un número binario 0101. Haciendo la suma de izquierda a derecha, obtenemos:

$$ DecimalEquivalent \ of\ (0101)_{2} = 0×2^3 + 1×2^2 + 0×2^1 + 1×2^0 \\ = 0 + 4 + 0 + 1 \\ = 5 $$

El lenguaje binario se usa en el lado del hardware porque hay señales y puertas lógicas en un circuito electrónico; es fácilmente comprensible por el sistema. Cada número binario 0 o 1 se conoce como 1 bit.

Algoritmo para convertir un número binario a un equivalente decimal

Veamos un procedimiento paso a paso para resolver este problema de conversión.

  1. Inicie el programa.
  2. Tome un número binario como entrada.
  3. Si el número es mayor que 0, divide el número por diez y saca el producto del resto con 2*i, donde i empieza desde cero.
  4. Continúe dividiendo el cociente como se explicó en el paso 3 e incremente i en uno en cada iteración.
  5. Sume todos los productos y devuelva los resultados.

Hay múltiples opciones de implementación para atender el problema. Comencemos discutiendo estos enfoques uno por uno.

Método 1: Convertir usando variables de bucle y enteras

Los bucles for y while pueden convertir de binario a decimal.

Usar bucle while

En este enfoque, la operación de división convertirá binario a decimal.

#include <math.h>
#include <stdio.h>
int main() {
  int binary_number;
  printf("Enter Binary number: ");
  scanf("%d", &binary_number);
  int decimal = 0, temp = 0, reminder;
  while (binary_number != 0) {
    reminder = binary_number % 2;
    binary_number = binary_number / 10;
    decimal = decimal + reminder * (int)pow(2, temp);
    temp++;
  }
  printf("Decimal number is : %d", decimal);
  return 0;
}

La primera línea en main() declara una variable llamada binary_number para tomar entrada binaria. Después de tomar la entrada de números binarios, estamos declarando además las tres variables:

  1. decimal: para almacenar el valor decimal resultante
  2. temp: para servir como contador de iteraciones
  3. reminder: para almacenar el resto en cada iteración

En cada iteración del bucle while, primero determinamos el bit más a la derecha del binary_number y lo guardamos en la variable resto.

Luego, dividimos el binary_number por diez y sobrescribimos el resultante sobre sí mismo. Esto hace que el binary_number pierda su bit más a la derecha.

Además, como comentamos al principio del artículo, aplicamos la fórmula para agregar los productos ponderados en la variable decimal. Al final, imprimimos el equivalente decimal resultante.

Veamos la salida.

Mientras bucle

Usar bucle for

La estructura básica de ambos bucles (for y while) es similar. La ventaja de usar un bucle for es la declaración e inicialización sencillas de la variable en una sola línea.

Aquí hay otro programa para convertir los números binarios a valores decimales usando el bucle for.

#include <stdio.h>
int main() {
  int binary, decimal = 0, base = 1, remainder, temp;
  printf("Enter binary number: ");
  scanf("%d", &binary);
  for (temp = binary; temp > 0; temp = temp / 10) {
    remainder = temp % 2;
    decimal = decimal + remainder * base;
    base = base * 2;
  }
  printf("Decimal number is:%d", decimal);
  return 0;
}

En la implementación del bucle for, utilizamos un enfoque ligeramente diferente al del bucle while.

En lugar de usar una costosa función pow(), simplemente creamos una variable base que se multiplicará con un valor de 2 en cada iteración. Esto asegurará que al inicio de la iteración i^th^, la variable base tenga un valor equivalente a 2^i^, donde i parte de cero.

Producción:

En bucle

Método 2: Utilice un enfoque procedimental

Este método utilizará un procedimiento o función definida por el usuario para resolver el problema de conversión. Este enfoque es el más deseable si desea que su código sea más reutilizable y modular.

#include <math.h>
#include <stdio.h>
int binarytodecimal(int binary_number) {
  int decimal = 0, temp = 0, remainder;
  while (binary_number != 0) {
    remainder = binary_number % 2;
    decimal = decimal + (remainder * pow(2, temp));
    binary_number = binary_number / 10;
    temp++;
  }
  return decimal;
}

int main() {
  int binary_number, decimal;
  printf("Enter binary number: ");
  scanf("%d", &binary_number);
  decimal = binarytodecimal(binary_number);

  printf("Decimal Number is: %d", decimal);
  return 0;
}

Todo es igual a nuestro método anterior excepto que adjuntamos todo el código de conversión a un solo procedimiento, binarytodecimal().

Salida para el método procesal

Método 3: use la matriz char para almacenar el número binario

En todos los métodos discutidos anteriormente, el problema principal es el tamaño del número entero. Estábamos almacenando números binarios en codificación de enteros.

Entonces, para un compilador de 16 bits, el número más grande que pudimos proporcionar fue 111111.

Los compiladores de 32 bits y 64 bits con números enteros más grandes seguramente aumentarán el rango de entrada y resolverán el problema. Sin embargo, el tema nos asustará en las versiones anteriores.

Afortunadamente, tenemos un truco para resolver el problema, es decir, usar una matriz dinámica char para almacenar números binarios en lugar de la variable entera. Veamos el siguiente código para entender la estrategia.

#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
  long decimal = 0;
  int size;
  printf("\nEnter maximum number of digits in your Binary number: ");
  scanf("%d", &size);

  char* BinaryArr = (char*)malloc(size + 1);

  printf("Please Enter your Binary Number: ");
  scanf("%s", BinaryArr);

  char ch;
  for (int i = size - 1, j = 0; i >= 0; i--, j++) {
    ch = BinaryArr[i];
    decimal += atoi(&ch) * (int)pow(2, j);
  }

  printf("The equivalent decimal number is: %d", decimal);
  return 0;
}

Primero pedimos a los usuarios que confirmen el tamaño del número binario que quieren convertir en un equivalente decimal.

Dado que conocemos el tamaño del número binario, asignamos dinámicamente una matriz de ese tamaño utilizando la función malloc(). El malloc() se define en stdlib.h y asigna memoria dinámica en bytes.

Para convertirlo en una matriz de caracteres, convertimos explícitamente el puntero de retorno de malloc() en un tipo char*.

Nota: El 1 extra en malloc(size +1) se debe a que queremos espacio para almacenar el carácter \0 al final.

A continuación, tomamos el número binario como entrada en la matriz de caracteres señalada por el puntero de carácter BinaryArr.

Después de eso, comenzamos a iterar esta matriz de caracteres desde el último índice (es decir, el bit menos significativo del número binario) y tomamos los caracteres binarios uno por uno acercándonos al índice 0 después de cada iteración.

Almacenamos el índice i^th^ en una variable auxiliar ch en cada iteración. Luego, aplicamos la función atoi() para obtener un valor entero equivalente.

Luego, ponemos todo en la fórmula discutida al comienzo de este artículo.

Finalmente, tan pronto como termina el bucle, imprimimos el valor decimal final. Veamos cómo se siente en la consola de salida.

Salida del método de matriz

Artículo relacionado - C Binary