您的位置:

Python 16进制转10进制

一、基本概念

计算机中常用的进制有二进制、八进制、十进制和十六进制等。十六进制是一种较常用的进制方式,用于表示二进制数方便快捷,转换为十进制则需要了解一些基本概念。

十六进制是基于16个数字进行计数,分别为0~9和A~F(大小写均可)。其中,A~F表示10~15这6个数字,如A代表10,B代表11,C代表12以此类推。

基本概念:一个n进制数中,每一位的权值为n的次幂,即从右到左第一位的权值为n的0次幂,第二位的权值为n的1次幂,以此类推。

二、为什么需要16进制

二进制数通常使用1和0表示一个数码,用于表示和处理计算机中的信息和数据,但是长串的1和0很难直观地理解。八进制数用3个二进制表示一位,稍微好理解一些,但是还是不太清晰。十六进制位于二进制和八进制之间,通过4个二进制数组合来表示一个数码,更便于计算和理解。同时,因为十六进制用A~F表示10~15,所以表示范围更广泛,包括了所有字母和数字,方便表示和记忆。

三、16进制转10进制算法及实现

16进制转10进制的基本算法:将16进制数每一位分别乘以对应的权值,然后相加即可得到10进制数。

【示例代码】

def hex_to_dec(hex_num):
    dec_num = 0
    for index, digit in enumerate(hex_num[::-1]):
        if digit.isdigit():
            dec_num += int(digit) * 16 ** index
        else:
            dec_num += (ord(digit.upper()) - 55) * 16 ** index
    return dec_num
    
hex_num = "FF"
print(hex_to_dec(hex_num))

代码解析:

  • hex_to_dec函数传入一个16进制的字符串,返回对应的10进制数。
  • for循环遍历16进制数的每一位。其中,hex_num[::-1]是将16进制数倒序排列,方便从右到左计算每一位的权值。
  • 如果该位是数字,直接将其转换为10进制数并乘以对应权值。
  • 如果该位是字母,则先将其转换为10进制数再乘以权值。
  • 累加每一位的结果即可得到10进制数。
  • 示例代码中,输入的16进制数为FF,输出结果为255。

四、应用场景

16进制转10进制可以用于网络通信和文件传输中的数据解析。例如,一些网络协议数据包中使用16进制表示数据头和数据体,收到数据包后需要将其转换为10进制来获取有效信息进行处理。

同时,在计算机数据存储中,也有可能需要将数据存储为16进制。早期的一些操作系统和程序,常用16进制数表示某些特定计算机内存中的数据。此外,在调试和修改程序过程中,也可能需要将16进制数据转换为10进制进行查看和分析。

五、十六进制到其他进制的转换

除了16进制转10进制,还可能出现其他进制之间的转换需求,这里简单介绍一下。

任意进制转10进制:按照基本算法,将每一位的权值相加即可,代码如下:

def any_to_dec(num, base):
    dec_num = 0
    for index, digit in enumerate(str(num)[::-1]):
        dec_num += int(digit) * base ** index
    return dec_num
    
num = "10011"
base = 2
print(any_to_dec(num, base))

代码解析:

  • any_to_dec函数传入一个num进制数和其对应的base进制数,返回对应的10进制数。
  • for循环遍历num每一位,计算对应的权值并累加。
  • 示例代码中,输入的二进制数为10011,输出结果为19。

10进制转任意进制:将10进制数除以目标进制数的基数,记录余数,反转得到的余数即可得到对应进制数的结果,代码如下:

def dec_to_any(dec_num, base):
    res_num = ""
    while dec_num != 0:
        remainder = dec_num % base
        if remainder > 9:
            res_num += chr(remainder + 55)
        else:
            res_num += str(remainder)
        dec_num = dec_num // base
    return res_num[::-1]
    
dec_num = 19
base = 16
print(dec_to_any(dec_num, base))

代码解析:

  • dec_to_any函数传入一个10进制数和目标进制数base,返回对应的num进制数字符串。
  • while循环将10进制数转换为目标进制数的余数,存储到res_num字符串中。
  • 如果余数大于9,则将其转换为字母形式存储;如果小于等于9,则直接存储数字形式。
  • 最后反转得到的字符串res_num即为目标进制数的结果。
  • 示例代码中,输入的10进制数为19,输出结果为13(对应16进制中的D)。