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
即使在反转范围顺序并重新导入后,我仍然得到相同的结果。
答案 0 :(得分: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
的索引应该在相反的方向上迭代,一个在另一个方向上逐渐减少。
现在你可以忘记这一点并使用别人建议的答案。
答案 1 :(得分:0)
在python中如果你想重新导入一些东西,你需要重新启动python进程,或者手动复制你在python中更改的文件的内容,或者更方便地使用ipython中的℅cpaste。
重新导入在python中不会像你冒险一样。
答案 2 :(得分:0)
太多 elif , pow ...只需 shift (result = result * 16)
和添加 {{ 1}}类似
(ord(ch) - ord(...))
答案 3 :(得分:0)
您是否观察过for循环生成的索引?
无论您扫描输入字符串(向前还是向后)的方向如何,索引都会为最左边的数字生成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)
答案 4 :(得分:0)
hexToDec = lambda hexi: int(hexi,16)
或在Python 2中:
hexToDec = lambda hexi: long(hexi,16)
答案 5 :(得分: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
答案 6 :(得分: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',''))))