Python二进制、八进制、十六进制数字的表示和转换

除了常用的十进制表示法,Python 也支持二进制、八进制和十六进制表示法。这些只是表示方法不同,但是它们表示的含义是一样的,如二进制中的 11 和十进制数中的 3 是一样的。

1. Python 二进制表示法

如十进制中的 100 用二进制表示就是 1100100,那么 100 就可以用 0b1100100 来表示。
>>> a = 0b1100100  # 二进制1100100
>>> a              # 查看其值,默认用十进制表示
100                # 对应到十进制就是100

用 0B 也可以表示二进制数,效果和 0b 是一样的,如十进制的 100 也可以用 0B1100100 来表示。
>>> a = 0B1100100
>>> a
100

另外一个问题就是,如果知道了某个数的值,如何知道其二进制的表示法?Python 提供了一个函数 bin(),该函数输入是整数,输出是用二进制表示的字符串。如 bin(100) 就输出字符串 '0b1100100'。
>>> a = bin(100)  # 得到十进制数100的二进制表示法
>>> a             # 查看二进制表示法的值
'0b1100100'
>>> type(a)       # 注意返回值是一个字符串
<type 'str'>
>>> b = bin(3)    # 得到十进制数3的二进制表示法
>>> b
'0b11'

如果得到的是字符串,表示一个二进制数,如何将其转换成整数对象呢?可以使用函数 eval()。eval() 输入是字符串,返回值是一个整数对象。
>>> a = eval('0b1100100')  # 输入是字符串
>>> type(a)                # 返回值类型是整型
<type 'int'>
>>> a                      # 返回值的内容
100

还有一个可以使用的函数就是 int(),其实际上是整型的构造函数。该构造函数可以从字符串对象构造出整型对象,而且在构造时指定进制。和函数 eval() 不同,字符串不能以 0b 开头,并且要指定进制。

还是以 100 为例,输入是字符串 '1100100' 而不是 '0b 1100100'。并且带上进制参数 2,所以就可以用 int('1100100',2) 来构造值为二进制 1100100 的整数对象。
>>> a = int("1100100", 2)  # 按照二进制的方式解析字符串"1100100",
>>> type(a)                # 返回值的类型是整型
<type 'int'>
>>> a                      # 返回值的内容是100
100

int() 还可以指定第二个参数为 0,这时第一个参数就可以带上 0b。int() 看到第二个参数为 0,就会从第一个参数的 0b 上猜出应该按照二进制来解析输入的字符串。
>>> a = int("0b1101", 0)  # 第二个参数为0,第一个参数带有0b,所以按照二进制解析
>>> type(a)               # 返回值类型是整数
<type 'int'>
>>> a                     # 返回值的值为十进制的13
13

2. Python 八进制表示法

类似于二进制表示法,在数字之前加上 0 用来表示其为八进制数。
>>> a = 012    # 八进制数12,等同于10进制的10
>>> type(a)
<type 'int'>
>>> a          # 查看a的值,默认是用十进制表示的
10

同样的问题,如何将一个整数转换成八进制的字符串?系统提供的函数是 oct(),其输入是整数对象,输出是一个字符串,该字符串也是以 0 开头。如数 oct(10) 就输出 '012'。
>>> out_str = oct(10)   # 转换成字符串类型,按照八进制的格式转换
>>> type(out_str)       # 返回值的类型是字符串
<type 'str'>
>>> out_str             # 查看返回值的内容
'012'
>>> out_str = oct(100)  # 对100进行八进制转换
>>> out_str             # 查看转换结果
'0144'

如何从用八进制表示的字符串构造出整数对象呢?前面介绍的 eval() 和 int() 方法依然有效。使用 eval() 时需要输入字符串以 0 开头,这样 eval() 就知道输入的数是八进制表示的。
>>> a = eval('012')   # 将字符串转换成整数,八进制格式表示的字符串
>>> type(a)           # 查看返回值的类型
<type 'int'>
>>> a                 # 查看返回值的内容
10
>>> a = eval('0144')  # 将八进制字符串144转换成整数
>>> a                 # 查看返回值的内容
100

使用 int() 来将字符串转换成整数,需要将第二个参数设定为 8,表示用八进制来解释该字符串,并且输入字符串不必以 0 开头。但是以 0 开头也不会有问题,因为 0 会被忽略掉,如 02 和 2 表示的意思是一样的。
>>> a = int('144', 8)   # 八进制数144,没有以0开头
>>> type(a)             # 输出的类型是整数
<type 'int'>
>>> a                   # 查看a的值,十进制表示为100
100
>>> a = int('0144', 8)  # 0144等效于144
>>> a                   # 但是0b11不等效于11
100
>>> a = int('12', 8)    # 八进制数12
>>> a
10

和二进制表示法一样,如果第二个参数为 0,并且第一个参数以 0 开头,那么 int() 将试图按照八进制来解析输入的第二个参数。例如:
>>> a = int("0144", 0)  # 第二个参数为0,那么从第一个参数猜出进制
>>> type(a)             # 由于第一参数以0开头,所以应该是八进制表示
<type 'int'>            # 返回值类型是整型
>>> a                   # 返回值是100,即八进制的144对应十进制的100
100

3. Python 十六进制表示法

十六进制表示法在数字前面加上 0x 或者 0X 来表示,除了用数字 0、1、…、9 这 10 个字符外,还引入了 a、b、c、d、e、f 这 6 个字符,分别表示 10、11、12、13、14 和 15。如十进制中的 15 用十六进制来表示就是 0xF 或者 0Xf。

需要注意的是,a、b、c、d、e、f 也可以用 A、B、C、D、E、F 来表示。
>>> a = 0xf   # 0x开头表示是十六进制数
>>> a
15
>>> a = 0XF   # 0X开头表示是十六进制数
>>> a
15
>>> a = 0Xf
>>> a
15

如果希望将整数转换成十六进制的字符串,可以使用函数 hex()。该函数输入是一个整型对象,输出是字符串。该输出字符串表示用十六进制表示该输入整数的格式。
>>> a = hex(9)    # 转换成十六进制表示的字符串
>>> type(a)       # 返回的是字符串
<type 'str'>      # 查看返回值的内容
>>> a
'0x9'
>>> b = hex(16)   # 将十进制的16转换成十六进制表示的字符串
>>> b
'0x10'            # 转换后的结果

如果希望做 hex() 的逆操作,可以使用 eval()。
>>> a = 100
>>> b = eval(hex(a))   # 先用hex()转换成十六进制表示的字符串
>>> type(b)            # 然后用eval()将字符串转换成整型对象
<type 'int'>           # 返回值的类型是整型
>>> b                  # 经过两轮互逆的运算后还是得到最初的值100
100

如果输入的字符串不带开头的 0x 或者 0X,那么可以用 int() 来构造一个等值的整型对象。例如,还和前面一样,第二个参数为 16。
>>> a = int('64', 16)  # 输入是十六进制表示的64
>>> type(a)            # 返回值是一个整型对象
<type 'int'>
>>> a                  # 值为100,对应十六进制中的64
100

和前面的二进制、八进制一样,如果第二个参数为 0,第一个参数以 0x 开头,那么 int() 会将第二个参数当作十六进制来解释。例如:
>>> a = int("0x64", 0)  # 第二个参数为0,所以从第一个参数猜出进制
>>> type(a)             # 第一个参数开头是0x,所以按照十六进制解析
<type 'int'>
>>> a                   # 解析结果是十进制的100
100

另外,int() 函数不仅可以用于转换二进制数、八进制数和十六进制数,也可以用于转换任意进制的数。对于 16,其用 F 后面的 G 来表示,17 用 H 来表示,其他值的表示法以此类推。下面的例子演示了 17 进制数的使用。
>>> int('F', 17)  # F表示15
15
>>> int('G', 17)  # G表示16
16