博客由来写在前面:由于计组老师要求我们课后查一下进制转换,因为底层的都是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
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐