Menu Close

De hexadecimal a decimal

El sistema hexadecimal es el sistema de numeración posicional que tiene como base el 16.

En principio, dado que el sistema usual de numeración es de base decimal y, por ello, sólo se dispone de diez dígitos, se adoptó la convención de usar las seis primeras letras del alfabeto latino para suplir los dígitos que nos faltan. El conjunto de símbolos es el siguiente: {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}. En ocasiones se emplean letras minúsculas en lugar de mayúsculas. Se debe notar que A = 10, B = 11, C = 12, D = 13, E = 14 y F = 15.

Como en cualquier sistema de numeración posicional, el valor numérico de cada dígito es alterado dependiendo de su posición en la cadena de dígitos, quedando multiplicado por una cierta potencia de la base del sistema, que en este caso es 16. Por ejemplo, el valor decimal del número hexadecimal 3E0A es

     3×16^3 + E×16^2 + 0×16^1 + A×16^0
   = 3×4096 + 14×256 + 0×16   + 10×1
   = 15882

Definir la función

   hexAdec :: String -> Int

tal que (hexAdec cs) es el valor decimal del número hexadecimal representado meiante la cadena cs. Por ejemplo,

   hexAdec "3E0A"   == 15882
   hexAdec "ABCDEF" == 11259375
   hexAdec "FEDCBA" == 16702650

Soluciones

import Data.Char (digitToInt)
import Numeric(readHex)
import Data.List (foldl')
 
-- 1ª solución
hexAdec1 :: String -> Int
hexAdec1 s =
  sum (zipWith (*) (map digitToInt (reverse s)) (iterate (*16) 1))
 
-- 2ª solución
hexAdec2 :: String -> Int
hexAdec2 = foldl' (\acc x -> acc * 16 + digitToInt x) 0
 
-- 3ª solución
hexAdec3 :: String -> Int
hexAdec3 = read . ("0x" ++)
 
-- 4ª solución
hexAdec4 :: String -> Int
hexAdec4 = fst . head . readHex

5 soluciones de “De hexadecimal a decimal

  1. alerodrod5
     
    import Data.Char
    esCaracter :: Char -> Bool
    esCaracter x = x`elem` ['A','B','C','D','E','F']
    valor :: Char -> Int
    valor x |isDigit x = digitToInt x
            |esCaracter x = head [y | (a,y) <- zip ['A','B','C','D','E','F'] [10..15], x==a]
            | otherwise = error "no es un caracter hexadecimal" 
     
    hexAdec :: String -> Int
    hexAdec [] = 0
    hexAdec (x:xs) = valor x * 16 ^ length xs + hexAdec xs
  2. agumaragu1
    import Data.Char (digitToInt)
    import Data.List (foldl')
     
    hexAdec2 :: String -> Int
    hexAdec2 = foldl' aux 0
      where aux x y = 16 * x + digitToInt y
  3. angruicam1
    import Numeric (readHex)
     
    hexAdec :: String -> Int
    hexAdec = fst . head . readHex
  4. Chema Cortés
    import           Data.List  (elemIndex)
    import           Data.Maybe (fromJust)
     
    carAdec :: Char -> Int
    carAdec = fromJust . flip elemIndex "0123456789ABCDEF"
     
    hexAdec :: String -> Int
    hexAdec = foldl (acc c -> acc * 16 + carAdec c) 0
  5. carbremor
    hexChar :: Char -> Integer
    hexChar c
          | c == '0' = 0
          | c == '1' = 1
          | c == '2' = 2
          | c == '3' = 3
          | c == '4' = 4
          | c == '5' = 5
          | c == '6' = 6
          | c == '7' = 7
          | c == '8' = 8
          | c == '9' = 9
          | c == 'A' = 10
          | c == 'B' = 11
          | c == 'C' = 12
          | c == 'D' = 13
          | c == 'E' = 14
          | c == 'F' = 15
          | otherwise     = 0
     
     
     
    hexAdec :: String -> Integer
    hexAdec cs = convertir (reverse cs )
          where  convertir []     = 0
                 convertir (x:xs) = hexChar x + 16 * convertir xs

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.