Skip to content

Instantly share code, notes, and snippets.

@parzibyte
Created August 7, 2019 22:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save parzibyte/fae775a8133a25b99d4d78e3b8b09f76 to your computer and use it in GitHub Desktop.
Save parzibyte/fae775a8133a25b99d4d78e3b8b09f76 to your computer and use it in GitHub Desktop.
#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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment