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

範囲の順序を逆にして再インポートした後でも、同じ結果が得られます。

4

7 に答える 7

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は反対方向に繰り返され、一方が増加し、もう一方が減少します。

これで、これを忘れて、他の人が提案した回答を使用できます。

于 2014-01-28T08:24:19.040 に答える
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)

于 2014-01-28T08:20:23.067 に答える
0
hexToDec = lambda hexi: int(hexi,16)

または Python 2 の場合:

hexToDec = lambda hexi: long(hexi,16)

?

于 2014-01-28T08:27:31.390 に答える
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
于 2014-01-28T08:33:49.103 に答える