/*
Conversión de binario a dígitos decimales.
Joaquín Ferrero, octubre 2015.
Constantes:
N : tamaño del array para almacenar los dígitos
Variables:
digitos : array donde se almacenan los dígitos
Compilación en Linux: gcc -o bin2dec bin2dec.c
*/
#include <stdio.h>
#include <math.h>
#include <stdint.h>
#define N 10 // N=3 para 8 bit. N=10 para 32 bit.
uint8_t digitos[N]; // reserva de espacio
void pinta_dec(uint8_t precision) {
int8_t i;
uint8_t ceros = 1; // indicador de ceros a la izquierda
for (i = precision-1; i >= 0; i--) {
if (!ceros || digitos[i] || i == 0) { // dígito normal
ceros = 0; // ya no hay ceros a la izquierda
printf("%c", digitos[i] + '0');
}
else // pintar un cero a la izquierda
printf(" "); // poner "0" en caso de quererlos
}
}
void byte2dec(uint8_t valor) {
uint8_t i, j;
for (i = 0; i < N; i++) // limpio los valores de salida
digitos[i] = 0;
for (i = 1; i <= 8; i++) {
for (j = N-1; j > 0; j--) {
digitos[j] <<= 1;
// si el dígito anterior es >= 5, se producirá una coversión a 10 o más cuando
// se multiplique aquel dígito por 2 (en la siguiente vuelta), por lo que necesitamos
// influir en el dígito actual (hay una decena más)
if (digitos[j-1] > 4) { // 5->8, 6->9, 7->10, 8->11, 9->12
digitos[j-1] += 3;
if (digitos[j-1] & 0x08) // ¿ dígito >= 8 ?
digitos[j] |= 0x01; // siguiente dígito ++
}
digitos[j] &= 0x0F;
}
digitos[0] <<= 1;
if (valor & 0x80) // ver siguiente bit superior de valor
digitos[0] |= 0x01;
digitos[0] &= 0x0F;
//pinta(valor, 4);
valor <<= 1;
}
}
void long2dec(uint32_t valor) {
uint8_t i, j;
for (i = 0; i < N; i++) // limpio los valores de salida
digitos[i] = 0;
for (i = 1; i <= 32; i++) {
for (j = N-1; j > 0; j--) {
digitos[j] <<= 1;
if (digitos[j-1] > 4) { // 5->8, 6->9, 7->10, 8->11, 9->12
digitos[j-1] += 3;
if (digitos[j-1] & 0x08) // ¿ dígito >= 8 ?
digitos[j] |= 0x01; // siguiente dígito ++
}
digitos[j] &= 0x0F;
}
digitos[0] <<= 1;
if (valor & 0x80000000) // ver siguiente bit superior de valor
digitos[0] |= 0x01;
digitos[0] &= 0x0F;
// pinta_dec(10); printf("\t%lx\n", (long int)valor);
valor <<= 1;
}
}
void main(void) {
uint8_t test[] = { 0, 0xFF, 100, 112, 75, 66 };
uint8_t n_test = 6;
uint8_t i;
uint32_t tlargo;
for (i = 0; i < n_test; i++) {
byte2dec(test[i]);
pinta_dec(3);
printf("\t%d\n", test[i]);
}
tlargo = (unsigned long int)pow(2,32) - 1;
long2dec(tlargo);
pinta_dec(10);
printf("\t%ld\n", (unsigned long)tlargo);
tlargo = 1.235778E8;
long2dec(tlargo);
pinta_dec(10);
printf("\t%ld\n", (unsigned long)tlargo);
}