Python二进制、八进制、十六进制数字的表示和转换
除了常用的十进制表示法,Python 也支持二进制、八进制和十六进制表示法。这些只是表示方法不同,但是它们表示的含义是一样的,如二进制中的 11 和十进制数中的 3 是一样的。
如十进制中的 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
类似于二进制表示法,在数字之前加上 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
十六进制表示法在数字前面加上 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
本文链接:http://so.lmcjl.com/news/202/