Python程序说明:十进制转十六进制
有人能给我解释一下这是怎么回事吗?我一直在看,但就是不明白。它似乎运行得很好,但我实在搞不懂。请大家帮帮我。
# 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 个回答
我来用一个例子解释一下,先从十进制数字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,继续取剩下的余数。
打印字符
好吧,我来试着解释一下。首先,我们来看一个函数,它把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
。
我希望这能更好地解释这个过程,特别是为什么需要使用//。