今天闲下来刷刷题,偶然刷到了Python的进制转换,就浅浅的学一学,特地记录如下。
题目链接:NP9 十六进制数字的大小
十进制是我们常用的数字形式,但机器使用的却是二进制,八进制,十六进制之类的,所以进制转换是基础要求,很多编程语言提供的有进制转换的方法,下面来扒一扒利用Python如何进行进制转换~
这里先说一个知识点:进制前面一般会有一个符号,这个符号表明了到底是多少进制。比如:
0b
;0o
;0x
;int()
、bin()
、hex()
进制转换Python里面转换为十进制的函数是int
,这个函数相信用Python的都应该用过,可以将浮点数转换成整数。这里提到了,多说一句,要注意int
函数是强行舍掉小数部分~看下面的例子:
>>> int(3.9)
3
>>> int(-3.9)
-3
要注意和floor()
函数区分,floor()
函数是向下取整,其余的函数就不多说了。
>>> import numpy as np
>>> np.floor(3.9)
3.0
>>> np.floor(-3.9)
-4.0
回到今天的主题,int
函数可以用于进制转换,其第一个参数是一个字符串,第二个参数是字符串的进制(默认是十进制)。
>>> num = "10010010"
>>> int(num) # 默认是十进制
10010010
>>> int(num, 2)
146
>>> int("7", 8)
7
>>> int("17", 8)
15
>>> int("33", 8)
27
>>> int("A", 16)
10
>>> int("AB", 16)
171
hex()
函数用于将10进制整数转换成16进制,返回16进制数以字符串形式表示。0x
是十六进制的标志。
>>> hex(10)
'0xa'
>>> hex(13)
'0xd'
>>> hex(255)
'0xff'
>>> type(hex(255))
<class 'str'>
bin()
函数返回一个整数 int 或者长整数 long int 的二进制表示。故用bin()
就可实现该需求,其用法和hex()
函数类似,0b
是二进制的标志。
>>> bin(1023) #十进制转换为二进制
'0b1111111111'
>>> bin(0o11) #八进制转换为二进制
'0b1001
>>> bin(0xa1) #十六进制转换为二进制
'0b10100001'
oct()
函数可以将任何进制的数变成八进制,0o
是八进制的标志。
>>> oct(0b11) #二进制转换为八进制
'0o3'
>>> oct(0o77) #八进制转换为八进制
'0o77'
>>> oct(505) #十进制转换为八进制
'0o62'
>>> oct(0xab) #十六进制转换为八进制
'0o253'
如果是二进制转十六进制,可以先转十进制再转十六进制,其它的也是类似的。
format()
进制转换format()
函数是可以实现进制转换的,主要用法如下:
format(x,'b') #将x转换为二进制
format(x,'o') #将x转换为八进制
format(x,'d') #将x转换为十进制
format(x,'x') #将x转换为十六进制
举一点例子:
>>> format(0o31, 'b') # 转换为二进制
'11001'
>>> format(85, 'o') # 转换为八进制
'125'
>>> format(88, 'x') # 转换为十六进制
'58'
>>> format(0b101011, 'd') # 转换为六进制
'43'
是不是觉得调用内置函数不够酷?亦或者忘了内置进制转换函数怎么办?下面来试试自定义的进制转换函数!
def n_to_ten(num, n):
res = 0
num = list(reversed(str(num)))
for i in range(len(num)):
res += int(num[i]) * (n ** i)
return res
测试:
>>> n_to_ten(435)
1077
def ten_to_seven(num, k=2):
s = "" # 记录余数
if num == 0: # 先判断是否为0,如果为0,直接返回0
return 0
elif num > 0: # 判断正负性,如果为正数,不记录
a = ''
else: # 如果为负数,记录为负号
a = '-'
while abs(num): # 当num为0时,循环结束
# 倒叙记录余数,注意,是倒叙记录
s, num = str(abs(num) % k) + s, abs(num) // k # num整除除进制数
return int(a + s) # 先将符号位和余数进行合并,再转换为int类型
测试:
>>> ten_to_seven(10, 2)
1010
>>> ten_to_seven(10, 8)
12
>>> ten_to_seven(10, 16)
10
需要注意,还是应该了解一下进制之间是如何转换的,不能盲目的用轮子,还是得适当的学会造轮子~
\quad
\quad
\quad
THE END