将十进制转换为十六进制(不使用 `hex()` 函数)

问题描述 投票:0回答:3

在开始任何事情之前,我只想说我知道

hex()
功能,对于这个项目我无法使用它。另外,关于here提出的问题,我知道这一点,并且我已经尝试过该解决方案,但无法让我的代码正常工作。这是一个不同的情况,因为我正在使用多个功能。该帖子也没有讨论我的第二个问题。

我有两个问题:

  1. 我到目前为止的代码可以将十进制转换为十六进制。我遇到困难的是,当我打印十六进制时,它会向后打印。
  2. 我希望输出为:

输入十进制值:589
589 等于十六进制的 24D

但是当我听到这条线时:

print(og_dec_value,"is equal to",getHexChar(hex_value),end="","in hexadecimal")

我收到一个关于

end=""
未在最后的错误。但如果我删除
end=""
那么它只会打印出十六进制的第一个数字,而忽略其余的数字。

这是我现在的代码:

def main():
    decToHex(int(input("Enter decimal value: ")))

def decToHex(dec_value):
    while dec_value > 0:
        hex_value=dec_value%16
        dec_value=dec_value//16
        print(getHexChar(hex_value),end="")

def getHexChar(dec_digit):
    if dec_digit < 10:
        return dec_digit
    if dec_digit == 10:
        return "A"
    if dec_digit == 11:
        return "B"
    if dec_digit == 12:
        return "C"
    if dec_digit == 13:
        return "D"
    if dec_digit == 14:
        return "E"
    if dec_digit == 15:
        return "F"

main()
python hex
3个回答
1
投票

首先我做了两个函数,一个将十进制转换为二进制,另一个相反:

def dec_to_bin(n):
    exp=0
    intsup = 2**exp
    bin_list = []
    while intsup < n:
        intsup = 2**exp
        exp += 1
    while exp >= 0:
        intsup = 2**exp
        if n - intsup >= 0 :
            n -= intsup
            bin_list.append(1)
        else:
            bin_list.append(0)
        exp -= 1

    bin_number = ""
    for i in bin_list:
        bin_number += str(i)
    bin_number = int(bin_number)
    return bin_number


def bin_to_dec(n):
    dec=0
    while dec_to_bin(dec) != n :
        dec+=1
    return dec

接下来,我制作了这个简短的函数,将 0 到 15 之间的十进制数转换为十六进制。

def hexshort(nbr):
    letters = ['A','B','C','D','E','F']
    for letter_num in range(len(letters)):
        if (10 + letter_num) == nbr:
            n=letters[letter_num]
    return nbr

最后,我制作了您需要的函数(将任何十进制数转换为十六进制),我们需要之前的函数,因为在这个函数中,在某些时候我们将十进制转换为二进制,然后二进制转换为十进制,最后我们使用短版本。

def hexconv(nbr):
    nbr = dec_to_bin(nbr)
    binary_list = []
    nbr = str(nbr)
    for i in nbr:
        binary_list.append(i)
    longueur = len(binary_list)

    while longueur%4 != 0:
        binary_list.insert(0,'0')
        longueur=len(binary_list)

    half_oct = longueur/4
    half_oct = int(half_oct)
    half_oct_list = []
    half_oct_temp_list = []
    for j in range(half_oct):
        while len(half_oct_list)!= half_oct:
            half_oct_temp_list = binary_list[0:4]
            for k in range(4):
                binary_list.pop(0)
            half_oct_list.append(half_oct_temp_list)

    mini_list = []
    for m in range(len(half_oct_list)):
        values = ''
        for n in range(len(half_oct_list[m])):
            values += half_oct_list[m][n]
        mini_list.append(values)

    val = ''
    for c in range(len(mini_list)):
        mini_list[c] = int(mini_list[c])
        mini_list[c] = bin_to_dec(mini_list[c])
        mini_list[c] = hexshort(mini_list[c])
        mini_list[c] = str(mini_list[c])
        val += mini_list[c]
    return val

该函数对 nbr = 1440 执行的操作示例:

1440 : dectobin
    10110100000
    [0101, 1010, 0000]
    bintodec :
        5 10 0
    hexa :
        5A0

Ps:我知道你可以使用内置函数将十进制转换为二进制和二进制转换为十进制,我只是想挑战自己而不是使用它们。


0
投票

虽然

getHexChar
返回单个字符串,但
decToHex
确实会动态打印单个数字。从代码中获得预期输出的最小更改可能是:

def main():
    og_dec_value = int(input("Enter decimal value: "))
    print(og_dec_value,"is equal to",decToHex(og_dec_value), "in hexadecimal")

def decToHex(dec_value):
    ret_val = str()
    while dec_value > 0:
        hex_value=dec_value%16
        dec_value=dec_value//16
        ret_val = getHexChar(hex_value) + ret_val
    return ret_val

def getHexChar(dec_digit):
    if dec_digit < 10:
        return str(dec_digit)
    if dec_digit == 10:
        return "A"
    if dec_digit == 11:
        return "B"
    if dec_digit == 12:
        return "C"
    if dec_digit == 13:
        return "D"
    if dec_digit == 14:
        return "E"
    if dec_digit == 15:
        return "F"

main()

那不碍事。我真的不确定

hex()
的问题是什么。如果我正在寻找另一种转换为十六进制字符串表示形式的方法,我会(按照 Moinuddin Quadri 的建议)选择相应的格式
'{0:x}'.format(int(dec))
'%x' % int(dec)
如果您更喜欢旧的样式(您可能不应该)。

如果这仍然是你想要的,并且你想维持你的阳离子过程,你至少可以显着简化

getHexChar()
,例如通过这样做:

def getHexChar(dec_digit):
    return '{:x}'.format(range(16)[dec_digit])

或者我们格式化确实是一种诅咒:

def getHexChar(dec_digit):
    return str((tuple(range(10)) + ('a', 'b', 'c', 'd', 'e', 'f'))[dec_digit])

0
投票

print("{:02X}".format(2555))=====>9FB #as string

© www.soinside.com 2019 - 2024. All rights reserved.