Para terminar la serie de ejercicios sobre conversiones de números entre distintas bases veremos cómo convertir un número octal a decimal usando el lenguaje de programación C.
Es exactamente el mismo algoritmo que usamos para convertir hexadecimal a decimal; únicamente cambia la base (de 16 a 8, porque octal es base 8) y la obtención de la equivalencia.
Lecturas recomendadas
Decimal a binario, octal y hexadecimal en C
Convertir hexadecimal a decimal en C
Algoritmo para convertir octal a decimal en C
Como lo dije, es igual que convertir hexadecimal a decimal. Ahora en lugar de elevar el 16 a la potencia según la posición, vamos a elevar el número 8.
Por otro lado, ya no necesitamos hacer una conversión tan larga; pues en octal se usan los dígitos del 0 al 7, no hay letras y por lo tanto podemos aplicar el truco de convertir un char a su representación entera.
Recorremos la cadena de derecha a izquierda y por cada carácter multiplicamos su valor por el resultado de elevar 8 a una potencia. Primero la potencia es 0, luego es 1 y así sucesivamente conforme nuestra cadena sea más larga.
Función que convierte octal a decimal en C
Aquí está el código de la función. Recibe como argumentos la cadena que representa al número octal y la longitud de la misma; devuelve un unsigned long long representando el número decimal.
/*
Algoritmo que convierte un número octal
a uno decimal en C
@author parzibyte
Visita: parzibyte.me1
*/
unsigned long long octalADecimal(char *cadenaOctal, int longitud) {
unsigned long long decimal = 0;
int potencia = 0;
for (int i = longitud - 1; i >= 0; i--) {
int valorActual = cadenaOctal[i] - '0';
// Elevar 8 a la potencia que se va incrementando, y multiplicarla por el
// valor
unsigned long long elevado = pow(BASE, potencia) * valorActual;
// Agregar al número
decimal += elevado;
// Avanzar en la potencia
potencia++;
}
return decimal;
}
No vemos el 8 en ningún lado porque tenemos definida arriba la base con #define BASE 8
. Para la equivalencia simplemente restamos ‘0’ al valor; dándonos su representación entera.
Por cierto, recuerda que aquí puedes ver cómo elevar un número a una potencia en C.
Uso de la función y ejemplo de conversión
Para implementarla podemos hacer esto:
/*
Algoritmo que convierte un número octal
a uno decimal en C
@author parzibyte
Visita: parzibyte.me
*/
#include <stdio.h> // printf y fgets
#include <string.h> // strlen
#include <math.h> // pow
#define LONGITUD_MAXIMA 1000
#define BASE 8
// Prototipos de funciones
unsigned long long octalADecimal(char *cadenaOctal, int longitud);
int main() {
// Esta primera parte tiene que ver con leer la entrada del usuario,
// únicamente para demostrar
char octal[LONGITUD_MAXIMA];
printf("Introduce un número octal de hasta %d caracteres:\n",
LONGITUD_MAXIMA - 1);
fgets(octal, LONGITUD_MAXIMA, stdin);
octal[strcspn(octal, "\r\n")] = 0;
// Ahora sí aquí convertimos
unsigned long long decimal = octalADecimal(octal, strlen(octal));
printf("El octal %s es %llu en decimal", octal, decimal);
return 0;
}
/*
Algoritmo que convierte un número octal
a uno decimal en C
@author parzibyte
Visita: parzibyte.me1
*/
unsigned long long octalADecimal(char *cadenaOctal, int longitud) {
unsigned long long decimal = 0;
int potencia = 0;
for (int i = longitud - 1; i >= 0; i--) {
int valorActual = cadenaOctal[i] - '0';
// Elevar 8 a la potencia que se va incrementando, y multiplicarla por el
// valor
unsigned long long elevado = pow(BASE, potencia) * valorActual;
// Agregar al número
decimal += elevado;
// Avanzar en la potencia
potencia++;
}
return decimal;
}
Recuerda que leemos con fgets para mayor seguridad. Para sacar la longitud de la cadena usamos strlen y lo demás ya está explicado.