博客由来写在前面:由于计组老师要求我们课后查一下进制转换,因为底层的都是01二进制进行编码的,故而想到用python进行传统的进制转换手推理解,配上python本身的函数进行答案对比,故有此篇博客。
每一个进制之间转换包含俩种算法,一种是直接调用python的进制转换包,一种是用人工计算进制转换的思路写的(其中2进制转为16进制,是采用2进制局部转为10进制再转为16进制的方法)
① 16进制转10进制
b_16 = '1111'
# 方法1 - 调用函数法
b_2 = int(b_16, 16)
print(b_2)
# 方法2 - 按照计算原则
b_16_len = len(b_16)
count = 0
for i in b_16:
temp = int(i)
count = count + temp*16**(b_16_len-1)
b_16_len = b_16_len - 1
print(count)
结果:
4369
4369
② 16进制转2进制
a_16 = '7A9B'
# 方法1 - 调用函数法
a_2 = bin(int(a_16,16))[2:]
print(a_2)
# 方法2 - 按照计算原则
for i in a_16:
if i == '1':
print('0001',end='')
if i == '2':
print('0010',end='')
if i == '3':
print('0011',end='')
if i == '4':
print('0100',end='')
if i == '5':
print('0101',end='')
if i == '6':
print('0110',end='')
if i == '7':
print('0111',end='')
if i == '8':
print('1000',end='')
if i == '9':
print('1001',end='')
if i == 'A':
print('1010',end='')
if i == 'B':
print('1011',end='')
if i == 'C':
print('1100',end='')
if i == 'D':
print('1101',end='')
if i == 'E':
print('1110',end='')
if i == 'F':
print('1111',end='')
结果:
111101010011011
0111101010011011
③ 10进制转16进制
c_10 = 1273
# 方法1 - 调用函数法
c_16 = hex(c_10)
print(c_16)
# 方法2 - 按照计算原则
list = []
while c_10//16 != 0:
temp = c_10%16
if temp <= 9:
list.append(temp)
if temp == 10:
temp = 'a'
list.append(temp)
if temp == 11:
temp = 'b'
list.append(temp)
if temp == 12:
temp = 'c'
list.append(temp)
if temp == 13:
temp = 'd'
list.append(temp)
if temp == 14:
temp = 'e'
list.append(temp)
if temp == 15:
temp = 'f'
list.append(temp)
c_10 = c_10//16
list.append(c_10%16)
for i in list[::-1]:
print(i,end='')
结果:
0x4f9
4f9
④ 10进制转2进制
d_10 = 17
# 方法1 - 调用函数法
d_2 = bin(d_10)
print(d_2)
# 方法2 - 按照计算原则
list = []
while d_10//2 != 0:
temp = d_10%2
list.append(temp)
d_10 = d_10//2
list.append(d_10%2)
for i in list[::-1]:
print(i,end='')
结果:
0b10001
10001
⑤ 2进制转16进制
e_2 = '1011011101'
# 方法1 - 调用函数法
e_16 = hex(int(e_2, 2))
print(e_16)
# 方法2 - 按照计算原则
## 1、确定有几个,最前面的1-4单独计算,后面的按照4的倍数进行计算
e_2_len = len(e_2) # 总长
e_2_first = e_2_len % 4 # 首位1-4
e_2_count = e_2_len // 4
list = [] # 保存
# 2->10->16 就不用传统方法了,上面都写过如何分步转换
if e_2_first!=0:
head = hex(int(e_2[0:e_2_first], 2))
list.append(head)
for i in range(e_2_count):
temp = e_2[e_2_first+4*i:e_2_first+4*(i+1)] # 4个为一个局部
list.append(hex(int(temp, 2)))
for i in list:
print(i[2],end='')
结果:
0x2dd
2dd
⑥ 2进制转10进制
f_2 = '1111'
# 方法1 - 调用函数法
f_10 = int(f_2, 2)
print(f_10)
# 方法2 - 按照计算原则
f_2_len = len(f_2)
count = 0
for i in f_2:
temp = int(i)
count = count + temp*2**(f_2_len-1)
f_2_len = f_2_len - 1
print(count)
结果:
15
15