Introducción

Vamos a ver cómo podemos convertir un número decimal a binario en C. Será más que nada un ejercicio resuelto, no vamos a ver optimizaciones ni nada de eso porque hay miles y mejores formas de hacerlo.

Dicho esto, veamos cómo convertir manualmente.

Más tarde veremos cómo convertirlo usando itoa 😉

Por cierto, te invito a leer el uso de la función div para que veas por qué usamos lldiv.

Punto decimal

Si después de leer el post quieres saber cómo convertir un número que tiene punto decimal te invito a ver mi otro artículo de programación para conversión de un número decimal con parte fraccionaria.

Convertir un número decimal a binario en C

Esto es lo mismo que cambiar un número base 10 a base 2. Aquí dejo el código:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


/*
 ============================
 *********   NOTA   *********
 ============================

 NUMERO_DE_BITS nunca debe ser mayor que 63
 excepto si ya hay procesadores de 128 bits ;)
*/#define NUMERO_DE_BITS 8
int main(int argc, char const *argv[])
{
 unsigned long long int decimal = 0; // Aquí guardar el número decimal que el usuario ingresa
 char binario[NUMERO_DE_BITS]; // Una cadena representando el número binario


 /*
  Llenar la cadena con ceros
 */ for (int i = 0; i < NUMERO_DE_BITS; ++i) binario[i] = '0';

 /*
  Calcular el máximo número que el usuario puede ingresar
 */ unsigned long long int maximo = pow(2, NUMERO_DE_BITS);

 printf("Ingresa el numero decimal [maximo %llu]: \n", maximo - 1);
 scanf("%llu", &decimal);

 // Aquí vamos a ir guardando los resultados de la división
 // Ver: https://parzibyte.me/blog/2018/09/26/funcion-div-en-c-obtener-residuo-cociente/

 lldiv_t resultadoDeLaDivision;

 /*
  Ahora iniciamos un contador en el número de bits que
  a su vez corresponde con la longitud de la cadena que guardará
  el número binario

  Lo hacemos inversamente (es decir, accedemos primero a la posición N - 1 en donde N es la longitud),
  y vamos restando en uno hasta llegar al 0.

  Con ese contador accedemos a la cadena y establecemos un 1 o 0 dependiendo del
  residuo al dividir el número entre 2

  Finalmente vamos asignando a 'decimal' el valor de dividirlo entre 2. 
  Por ejemplo, si es 23 entonces...
   Primero es 23, sobra 1 y ahora es 11
   Luego dividimos 11 entre 2, es 5 y sobra 1
   Seguimos dividiendo a 5 entre 2, es 2 y sobra 1
   Ahora dividimos a 2 entre 2, es 1 y sobra 0
   Finalmente dividimos a 1 entre 2, es 0 y sobra 1
   Al llegar al último paso, decimal será 0 y el ciclo terminará
 */
 int contador = NUMERO_DE_BITS;

 while(decimal > 0){
  resultadoDeLaDivision = lldiv(decimal, 2);
  contador--;
  binario[contador] = resultadoDeLaDivision.rem == 1 ? '1' : '0';
  decimal = resultadoDeLaDivision.quot;
 }
 printf("El numero en binario es: %s\n", binario);
 return 0;
}

Está largo por los comentarios, pero bueno vamos paso por paso.

Declaramos una cadena de longitud N, y N es el número de bits. De esto depende el máximo número decimal que el usuario puede ingresar, el cual obtenemos elevando dos a la potencia N y restando uno al resultado.

Por ejemplo, si el número es 8 entonces 2 ^ 8 = 256, menos 1 = 255

Llenamos la cadena con ceros desde 0 hasta el número de bits (que es lo mismo que la longitud)

Luego vamos dividiendo el número entre dos, usamos la función lldiv para dividir un long long sin perder precisión. Comparamos el residuo, si es uno entonces a la cadena le ponemos un uno, y si es cero pues cero.

Por cierto, al número le asignamos el resultado de dividirlo entre 2. Por ejemplo, si es 20 entonces luego será 10, más tarde 5, 2, 1 y 0.

Vamos así hasta que el número se convierte en cero, que es cuando salimos del ciclo e imprimimos el número binario.

Cabe mencionar que usamos el contador y lo vamos disminuyendo debido a que si dividimos el número entre dos y vamos imprimiendo el residuo, el número binario estará al revés; es por ello que empezamos desde el final de la cadena hasta llegar al índice 0.

Finalmente, si cambiamos a NUMERO_DE_BITS podemos permitir números mucho más grandes.

Uso del programa

Bueno, ahora veamos algunos casos de uso. En este caso lo compilé con NUMERO_DE_BITS en 8, por lo que el máximo decimal que podemos poner es 255:

Convertir un número decimal a binario en c: con 8 bits

La salida es correcta. Imprime todo como debería ser.

Más tarde lo compilé con 63 bits:

Convertir un número decimal a binario en c: con 63 bits

Y así es como podemos convertir un número decimal a binario en este maravilloso lenguaje.

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

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…

2 días 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…

2 días 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…

2 días hace

Errores de Comlink y algunas soluciones

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

2 días 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…

2 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

3 días hace

Esta web usa cookies.