2014-01-28 3 views
0
import math 
def hexToDec(hexi): 
    result = 0 
    for i in range(len(hexi)-1,-1,-1): 
     if hexi[i] == 'A': 
      result = result + (10 * math.pow(16,i)) 
     elif hexi[i] == 'B': 
      result = result + (11 * math.pow(16,i)) 
     elif hexi[i] == 'C': 
      result = result + (12 * math.pow(16,i)) 
     elif hexi[i] == 'D': 
      result = result + (13 * math.pow(16,i)) 
     elif hexi[i] == 'E': 
      result = result + (14 * math.pow(16,i)) 
     elif hexi[i] == 'F': 
      result = result + (15 * math.pow(16,i)) 
     else: 
      result = result + (int(hexi[i]) * math.pow(16,i)) 
    return result 

Даже после изменения порядка и реимпортации диапазона я по-прежнему получаю те же результаты.python hex to decimal с использованием для цикла

+1

Почему нет 'int (hexi, 16)' cut it? Кажется, он способен обрабатывать огромные числа в py3. (Возможно, 'long (hexi, 16)' работает в py2?) –

ответ

1

Хотя могут быть прекрасные ответы как этот

x = int("FF0F", 16) 

Важно также, чтобы увидеть, как исходный код пошло не так. Исправленный вариант должен быть:

import math 
def hexToDec(hexi): 
    result = 0 
    for i in range(len(hexi)): 
     cur_pow = len(hexi) - i - 1 
     if hexi[i] == 'A': 
      result = result + (10 * math.pow(16,cur_pow)) 
     elif hexi[i] == 'B': 
      result = result + (11 * math.pow(16,cur_pow)) 
     elif hexi[i] == 'C': 
      result = result + (12 * math.pow(16,cur_pow)) 
     elif hexi[i] == 'D': 
      result = result + (13 * math.pow(16,cur_pow)) 
     elif hexi[i] == 'E': 
      result = result + (14 * math.pow(16,cur_pow)) 
     elif hexi[i] == 'F': 
      result = result + (15 * math.pow(16,cur_pow)) 
     else: 
      result = result + (int(hexi[i]) * math.pow(16,cur_pow)) 
    return result 

ли вам цикл в «обратном» или нет, порядок мощности и индекс к hexi должны итерации в противоположном направлении, одно другого увеличение уменьшается.

Теперь вы можете забыть об этом и использовать ответы, предлагаемые другими.

+0

+1 для использования цикла for, как и для op. –

+0

Я бы улучшил его, используя '+ =' много. – Alfe

+0

И обсадка каждой буквы, очевидно, не самый лучший способ сделать это, даже если вы оставите идею цикла без изменений. 'result + = (ord (hexi [i]) - ord ('A') + 10) * (16 ** cur_pow)' (или даже '... << (4 * cur_pow)') woudl дополнительно улучшит это решение; -) – Alfe

0

В python, если вы хотите повторно импортировать что-то, вам нужно перезапустить процесс python или вручную скопировать содержимое файла, который вы изменили в python, или более удобно с помощью ℅cpaste в ipython.

Реимпорт не работает в python так, как вы expexting.

+0

Извините, что на самом деле то, что я сделал. В IDLE я запустил модуль и перезапустил процесс python. – user3243566

0

Слишком много Элиф, пау ... Просто сдвиг(result = result * 16) и добавить(ord(ch) - ord(...)) что-то вроде

""" Manual hexadecimal (string) to decimal (integer) conversion 
    hexadecimal is expected to be in uppercase 
""" 
def hexToDec(hexi): 
    result = 0; 

    for ch in hexi: 
    if 'A' <= ch <= 'F': 
     result = result * 16 + ord(ch) - ord('A') + 10 
    else: 
     result = result * 16 + ord(ch) - ord('0') 

    return result; 
+1

__ 'A' <= ch <= 'F' __ – volcano

+0

@volcano: Спасибо! 'A' <= ch <= 'F' является более питонической конструкцией, в которой общие сравнения ch> = 'A' и ch <= 'F' –

+0

Всегда приятно :) – volcano

0

вы наблюдали индексы, сгенерированные ваш цикл?

независимо от направления, которое вы берете для сканирования входной строки (вперед или назад), индексы генерируют 0 для самой левой цифры и len(i)-1 для самого правого. поэтому, когда вы используете индекс для вычисления «разрядного места» в math.pow(16,i), вы вычисляете, как будто первый символ входной строки является самой правой (наименее значимой) цифрой.

попробовать с помощью math.pow(16, len(hexi)-1-i) ...

после внесения этой поправки, направление сканирования (вперед или назад) не имеет значения. вы можете переписать цикл for как for i in range(len(hexi)):.

также, вы знаете, что вам не нужно импортировать модуль math для вычисления мощности? Вы можете использовать оператор **: 2**4, 16**i, 16**(len(hexi)-1-i)

0
hexToDec = lambda hexi: int(hexi,16) 

или Python 2:

hexToDec = lambda hexi: long(hexi,16) 

?

0

У других есть быстрый способ сделать это, но так как вы хотели его в цикле for ... Вы проблема в ваших параметрах цикла, мощность должна быть len строки - текущее место - 1 Как и @ YS-L сделал в своем ответе также вместо того, чтобы использовать if-else у вас есть словарь!(Вы можете также проверить 'A' <= myCurrentChar <= 'F' вместо)

import math 
def hexToDec(hexi): 
    result = 0 
    convertDict = {"A": 10, "B": 11, "C": 12, "D": 13, "E": 14, "F": 15} 
    for i in range(len(hexi)):  
     if str.isdigit(hexi[i]): 
      result += int(hexi[i]) * math.pow(16, len(hexi) - i - 1) 
     else: 
      result += convertDict[hexi[i]] * math.pow(16, len(hexi) - i - 1) 

    return int(result) 

print hexToDec("FFA") 

Выход:

4090 
0

Однострочник - (не очень читаемый) - но работает в нижнем регистре и обрабатывает 0x префикс

sum(16**pwr*(int(ch) if ch.isdigit() else (ord(ch.lower())-ord('a')+10)) 
    for pwr, ch in enumerate(reversed(hexi.replace('0x','')))) 

 Смежные вопросы

  • Нет связанных вопросов^_^