Java: convertir hexadecimal a decimal

Hoy vamos a ver otro ejercicio de programación en Java. Se trata de convertir un número hexadecimal a uno decimal.

Vamos a ver dos maneras de pasar hexadecimal a decimal en Java; la primera utiliza un método que ya viene incluido en la API de Java y la segunda forma es un algoritmo manual.

Ejemplo de hexadecimal a decimal

Por si no lo tienes claro, en hexadecimal solo se usan los números del 0 al 9 y las letras de la A a la F. Las letras tienen un valor numérico, comenzando con que A vale 10 y terminando en que F vale 15.

Un ejemplo es que el hexadecimal FF vale 255 o que el hexadecimal AB vale 171; todo eso lo puedes comprobar en el conversor de bases online.

Es momento de comenzar con el código.

Usar Integer.parseInt para pasar de base 16 a base 10

Como lo dije, existe un método ya programado que devuelve un número decimal y recibe una cadena indicando el número hexadecimal. Se trata de la función parseInt y su uso es:

int decimal = Integer.parseInt(hexadecimal, 16);

Lo importante aquí es que como segundo argumento se indica la base, que en este caso es 16 pues en hexadecimal se usan 16 caracteres.

En los ejemplos veremos su uso de manera más clara.

Método manual para hexadecimal a decimal en Java

Nosotros también podemos implementar la lógica para convertir el número.

Lo que tenemos que hacer es ir aumentando a una variable que tendrá el número decimal, definido por el resultado de elevar 16 a una base que es dada por un consecutivo según se avance en la cadena, y luego multiplicar eso por el valor del carácter.

Para obtener el valor dependiendo del carácter veremos otra función que devuelve un entero para cualquier carácter hexadecimal.

Obtener valor numérico según carácter

La función es la siguiente:

public static int caracterHexadecimalADecimal(char caracter) {
    switch (caracter) {
        case 'A':
            return 10;
        case 'B':
            return 11;
        case 'C':
            return 12;
        case 'D':
            return 13;
        case 'E':
            return 14;
        case 'F':
            return 15;
        default:
            return Integer.parseInt(String.valueOf(caracter));
    }
}

Lo único que estamos haciendo es devolver el valor numérico de cada carácter. Si no es ninguna letra, entonces intentamos convertir el carácter a entero.

Es decir, si es ‘1’ entonces devolvemos 1. Y si es una letra, devolvemos el valor de la misma.

Conversión hexadecimal a decimal

Y aquí el código que realiza realmente la conversión:

public static long hexadecimalADecimal(String hexadecimal) {
    long decimal = 0;
    // Saber en cuál posición de la cadena (de izquierda a derecha) vamos
    int potencia = 0;
    // Recorrer la cadena de derecha a izquierda
    for (int x = hexadecimal.length() - 1; x >= 0; x--) {
        int valor = caracterHexadecimalADecimal(hexadecimal.charAt(x));
        long elevado = (long) Math.pow(16, potencia) * valor;
        decimal += elevado;
        // Avanzar en la potencia
        potencia++;
    }
    return decimal;
}

Fíjate que estamos recorriendo la cadena de derecha a izquierda o de fin a inicio, esto es porque las potencias de 16 se deben ir contando de derecha a izquierda tomando en cuenta el carácter actual.

Poniendo todo junto

Ahora veamos el código completo de la conversión, con una pequeña demostración:

/*

  ____          _____               _ _           _       
 |  _ \        |  __ \             (_) |         | |      
 | |_) |_   _  | |__) |_ _ _ __ _____| |__  _   _| |_ ___ 
 |  _ <| | | | |  ___/ _` | '__|_  / | '_ \| | | | __/ _ \
 | |_) | |_| | | |  | (_| | |   / /| | |_) | |_| | ||  __/
 |____/ \__, | |_|   \__,_|_|  /___|_|_.__/ \__, |\__\___|
         __/ |                               __/ |        
        |___/                               |___/         
    
    Blog:       https://parzibyte.me/blog
    Ayuda:      https://parzibyte.me/blog/contrataciones-ayuda/
    Contacto:   https://parzibyte.me/blog/contacto/
    
    Copyright (c) 2020 Luis Cabrera Benito
    Licenciado bajo la licencia MIT
    
    El texto de arriba debe ser incluido en cualquier redistribucion
*/
public class Main {
    public static void main(String[] args) {
        String hexadecimal = "AB";
        long decimal = Integer.parseInt(hexadecimal, 16);
        System.out.printf("El hexadecimal %s es %d en hexadecimal usando Integer.parseInt\n", hexadecimal, decimal);
        decimal = hexadecimalADecimal(hexadecimal);
        System.out.printf("El hexadecimal %s es %d en hexadecimal usando forma propia\n", hexadecimal, decimal);
    }

    public static int caracterHexadecimalADecimal(char caracter) {
        switch (caracter) {
            case 'A':
                return 10;
            case 'B':
                return 11;
            case 'C':
                return 12;
            case 'D':
                return 13;
            case 'E':
                return 14;
            case 'F':
                return 15;
            default:
                return Integer.parseInt(String.valueOf(caracter));
        }
    }

    public static long hexadecimalADecimal(String hexadecimal) {
        long decimal = 0;
        // Saber en cuál posición de la cadena (de izquierda a derecha) vamos
        int potencia = 0;
        // Recorrer la cadena de derecha a izquierda
        for (int x = hexadecimal.length() - 1; x >= 0; x--) {
            int valor = caracterHexadecimalADecimal(hexadecimal.charAt(x));
            long elevado = (long) Math.pow(16, potencia) * valor;
            decimal += elevado;
            // Avanzar en la potencia
            potencia++;
        }
        return decimal;
    }
}

Si lo ejecutamos, ambos métodos coinciden, es decir, la conversión es correcta:

Hexadecimal a decimal en Java – 2 métodos

Si te parece interesante, te invito a explorar más sobre Java.

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.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *