Hoy vamos a abordar la conversión de bases numéricas en Java. Específicamente vamos a ver el algoritmo para convertir octal (base 8) a decimal (base 10).
El algoritmo que vamos a usar será manual, es decir, lo vamos a programar nosotros.
Función que convierte octal a decimal
He separado el algoritmo dentro de una función para que sea claro de entender. Recibimos una cadena y la recorremos de derecha a izquierda.
Dentro del recorrido, en cada paso convertimos el char actual a entero, elevamos 8 (porque es octal) al número de potencia que irá aumentando por cada dígito y lo multiplicamos por el número actual.
Al resultado anterior lo vamos sumando en un número que será el valor decimal.
public static long octalADecimal(String octal) {
long decimal = 0;
int potencia = 0;
for (int x = octal.length() - 1; x >= 0; x--) {
int valorActual = Character.getNumericValue(octal.charAt(x));
long elevado = (long) Math.pow(8, potencia) * valorActual;
decimal += elevado;
potencia++;
}
return decimal;
}
En pocas palabras recorremos de derecha a izquierda y elevamos el 8 a la potencia dependiendo del número de dígito, cuyo resultado multiplicamos por el entero actual.
Octal a decimal en Java
Es momento de probar el ejercicio. Podemos usar un Scanner para solicitar la cadena octal al usuario y después imprimir el resultado:
/*
Programado por Luis Cabrera Benito
____ _____ _ _ _
| _ \ | __ \ (_) | | |
| |_) |_ _ | |__) |_ _ _ __ _____| |__ _ _| |_ ___
| _ <| | | | | ___/ _` | '__|_ / | '_ \| | | | __/ _ \
| |_) | |_| | | | | (_| | | / /| | |_) | |_| | || __/
|____/ \__, | |_| \__,_|_| /___|_|_.__/ \__, |\__\___|
__/ | __/ |
|___/ |___/
Blog: https://parzibyte.me/blog
Ayuda: https://parzibyte.me/blog/contrataciones-ayuda/
Contacto: https://parzibyte.me/blog/contacto/
*/
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Escribe el octal:");
String octal = sc.nextLine();
long decimal = octalADecimal(octal);
System.out.printf("El octal %s es %d en decimal", octal, decimal);
}
public static long octalADecimal(String octal) {
long decimal = 0;
int potencia = 0;
for (int x = octal.length() - 1; x >= 0; x--) {
int valorActual = Character.getNumericValue(octal.charAt(x));
long elevado = (long) Math.pow(8, potencia) * valorActual;
decimal += elevado;
potencia++;
}
return decimal;
}
}
En mi caso lo he probado con el número 123
que en octal es 83
. Puedes comprobarlo con este conversor de bases open source.
Si te gusta Java te invito a leer más tutoriales del lenguaje.