Преобразование шестнадцатеричного в десятичное с использованием словарей

1

В принципе:

Я пытаюсь преобразовать hex в десятичный с помощью словарей, но я не могу понять, как бы его преобразовать. Я попытался использовать цикл for для итерации по шестнадцатеричному значению, которое вводит пользователь, и для преобразования каждого из них путем умножения его на мощность 16 в зависимости от длины шестнадцатеричного кода. Например, если пользователь входит в F21, программа должна признать, что длина равна 3, поэтому следует начинать с умножения 15 (F) на 16 ^ 2 и добавить это к 2 * 16 ^ 1 и добавить это к 1 * 16 ^ 0. Но я сталкиваюсь с таким количеством ошибок

Шестнадцатеричный до десятичного словаря:

hex_to_decimal = {
    "0":"0",
    "1":"1",
    "2":"2",
    "3":"3",
    "4":"4",
    "5":"5",
    "6":"6",
    "7":"7",
    "8":"8",
    "9":"9",
    "A":"10",
    "B":"11",
    "C":"12",
    "D":"13",
    "E":"14",
    "F":"15"
}

Замечания:

Я не пытаюсь использовать это решение, поскольку я пытаюсь практиковать словари

s = "F21"
i = int(s, 16)
  • 0
    «Но я сталкиваюсь с таким количеством ошибок», какие ошибки? Вы должны показать нам, что вы пытались, и, в частности, что идет не так, если мы сможем помочь.
  • 0
    Аарон Решением был код спагетти, и я не хочу его улучшать, но хотел бы найти альтернативный эффективный способ выполнения этой задачи.
Теги:
dictionary

3 ответа

0
Лучший ответ

Поскольку вы конвертируете в десятичные числа, базу по умолчанию для целых чисел, вы должны сделать значения целых чисел hex_to_demical а не строк, чтобы вы могли выполнять числовые операции для каждого переведенного шестнадцатеричного числа:

hex_to_decimal = {
    "0": 0,
    "1": 1,
    "2": 2,
    "3": 3,
    "4": 4,
    "5": 5,
    "6": 6,
    "7": 7,
    "8": 8,
    "9": 9,
    "A": 10,
    "B": 11,
    "C": 12,
    "D": 13,
    "E": 14,
    "F": 15
}
def convert(s):
    i = 0
    for h in s:
        i = i *16 + hex_to_decimal[h]
    return i

с вышеуказанным кодом,

convert('F21')

вернется:

3873
  • 0
    Спасибо, за исключением того, что это будет i = i *16 + int(hex_to_decimal[h])
  • 0
    Пожалуйста. Как я уже говорил, вам не нужно преобразование int если вы инициализируете ваш hex_to_decimal целыми числами, а не строками.
0

Однострочный, используя enumerate и sum:

def conv(s):
    return sum(16**i*int(hex_to_decimal[x]) for i, x in enumerate(s[::-1]))

conv('FF')
# 255
conv('A1')
# 161
conv('F21')
# 3873
0

Просто просмотрите индекс i и цифру n шестнадцатеричной строки, используя enumerate(), и выполните вычисление n_dec*16**i (например, с n_dec = 15 при n = F). В частности, мы имеем n_dec = int(hex_to_decimal[n]) с требуемым значением int() потому что вы храните значения вашего dict как str s. Наконец, sum все:

s_hex = "F21"
s_dec = str(sum(
    int(hex_to_decimal[n])*16**i for i, n in enumerate(reversed(s_hex))
))

reversed() необходим, потому что первые (шестнадцатеричные) цифры относятся к более крупным значениям. str() используется только для того, чтобы сохранить окончательный десятичный результат как str, так же, как значения в вашем dict.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню