Python程序说明:十进制转十六进制

1 投票
2 回答
549 浏览
提问于 2025-04-18 02:36

有人能给我解释一下这是怎么回事吗?我一直在看,但就是不明白。它似乎运行得很好,但我实在搞不懂。请大家帮帮我。

# Convert a decimal to a hex as a string 
def decimalToHex(decimalValue):
    hex = ""

    while decimalValue != 0:
        hexValue = decimalValue % 16 
        hex = toHexChar(hexValue) + hex
        decimalValue = decimalValue // 16

    return hex

# Convert an integer to a single hex digit in a character 
def toHexChar(hexValue):
    if 0 <= hexValue <= 9:
        return chr(hexValue + ord('0'))
    else:  # 10 <= hexValue <= 15
        return chr(hexValue - 10 + ord('A'))

def main():
    # Prompt the user to enter a decimal integer
    decimalValue = eval(input("Enter a decimal number: "))

    print("The hex number for decimal", 
        decimalValue, "is", decimalToHex(decimalValue))

main() # Call the main function

2 个回答

1

我来用一个例子解释一下,先从十进制数字11开始。

11的十六进制表示是0xB。

11对16取余是11。对吧?这意味着hexValue变成了整数11。

所以整数11被传递给toHexChar函数。

我们有:

toHexChar(11)

11大于9,所以走的是else的路径。

11减去10当然是1。

字母'A'的ASCII值是65,或者说是0x41,所以ord('A')的结果是65。

1加65等于66。

chr()函数可以把一个整数值转换成ASCII字符。ASCII值66对应的字符是'B',所以toHexChar返回'B'。

因此,hex = 'B'。

接下来,decimalValue // 16,记住这是整数除法,结果是0,因此我们跳出while循环,所以decimalToHex(11)返回'B'。

再来看一个例子,数字17。

17对16取余等于1,所以我们有字符串'1'。

17除以16也等于1。所以我们再循环一次。

在下一次循环中,1 % 16的结果是1,toHexChar返回'1'。

hex = toHexChar(hexValue) + hex

这意味着:

hex = toHexChar(1) + '1'

hex = '1' + '1'

结果是"11"。

可以试着用几个例子来思考一下,逐步替换。

这个过程的基础是对16取余来得到余数。余数不能直接使用,因为如果数字在10到16之间,就需要用到A-F这些字符,所以才会用到toHexChar函数。

然后你再除以16,继续取剩下的余数。

1

打印字符

好吧,我来试着解释一下。首先,我们来看一个函数,它把0到15的数字转换成0123...ABCDEF:

def toHexChar(hexValue):
  if 0 <= hexValue <= 9:
    return chr(hexValue + ord('0'))
  else:  # 10 <= hexValue <= 15
    return chr(hexValue - 10 + ord('A'))

你可以看到,这个函数处理了两种情况:一种是把0到9的数字转换成字符'0'到'9',另一种是把10到15的数字转换成字符'A'到'F'。它会根据这些字符的ASCII码返回相应的字符。例如,ord('A')返回65,而chr()则可以把65转换回字符'A'。

这就是关于打印函数的内容。接下来是循环:

循环直到生成所有的十六进制字符

while decimalValue != 0:

这个循环会一直运行,直到不能再提取16的部分为止。

hexValue = decimalValue % 16

这是普通的取余操作。它从十进制数中提取出一部分(hexValue的值会在0到15之间)。

hex = toHexChar(hexValue) + hex

这行代码在构建一个字符串。因为十六进制的标准是把较大的部分放在左边,所以它会把转换后的字符放在字符串的前面。

decimalValue = decimalValue // 16

为下一次循环做准备:通过使用floordiv(a, b)(用a // b表示)来去掉这个16的部分。

示例

让我们理解一下这个过程。假设我们想把数字255转换成十六进制字符串。首先会进行取余操作255 % 16 = 15。然后它会被转换为toHexChar(15) = 'F'

接下来的步骤是去掉这个16的部分。如果我们使用普通的除法,会得到255 / 16 = 15.9375。但因为这个结果在小数点后超过了0.5,所以会被四舍五入,导致错误的结果(结果会是0x1FF)。这就是为什么我们必须使用整除,整除的结果是floor(255/16) = 15,简写为255 // 16 = 15

我希望这能更好地解释这个过程,特别是为什么需要使用//。

撰写回答