0x00 题目
请写一个 Python 程序实现实数的「三位一并法」与「四位一并法」。输入一个八进制小数,利用三位一并法将其转换为二进制实数,并输出,再利用四位一并法将上一步得到的二进制实数转换为十六进制实数,并输出。e.g. 输入 2.04(8) 输出 010.00100(2) 和 2.1(16)。
0x01.知识储备
二进制与十六进制数之间的对应关系
二进制数 | 十六进制数 |
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
1111 | F |
二进制转化为十六进制的方法是,三位一并法
举个栗子 010.000100(2) 的转化,以小数点为界,整数和小数部分内每四位数为一组进行分组进行转化。因为分组时无法凑足三位,需要补位。
对整数部分,在最左边补充0,对于小数部分,在最右边补充0,即:
二进制数 | 0010 | . | 0001 | 0000 |
十六进制数 | 2 | . | 1 | 0 |
十六进制转二进制的方法,三位一并法的逆用
举个粒子
十六进制数 | E | . | E | 4 |
二进制数 | 1110 | . | 1110 | 0100 |
0x02. Python 的实现
# coding=utf-8
import re
print('请输入一个八进制小数:')
oct_num = input()
binary = ''
is_minus = False
# 三位一并法逆用: 8进制小数转2进制小数
for o in oct_num:
if o == '.':
binary += '.'
elif o == '-':
# 处理负数
binary += ''
is_minus = True
else:
binary += format(int(o), '03b')
# 负数处理
sym = '-' if is_minus is True else ''
print(sym + binary)
# 四位一并法2进制小数转16进制小数
binary = binary.split('.')
def cov(binary_num):
# 补位使整数和小数部分均可被 4 整除
# 此函数返回需要补充的0字符串
remainder = len(binary_num) % 4
if remainder == 0:
return ''
else:
return (4 - remainder) * str(0)
binary[0] = cov(binary[0]) + binary[0] # 整数部分补位补在前面
binary[1] += cov(binary[1]) # 小数部分补位补在后面
print(binary[0] + '.' + binary[1])
# 四位一组切割字符串变成一个元组
t1 = re.findall(r'.{4}', binary[0])
t2 = re.findall(r'.{4}', binary[1])
print(t1)
print(t2)
oct_num1 = ''
for i in t1:
oct_num1 += format(int(i, 2), 'x')
oct_num2 = ''
for i in t2:
oct_num2 += format(int(i, 2), 'x')
# 处理掉首位出现0的情况,不明白可以注释掉下面两行然后运行脚本尝试
if oct_num1[0] == '0':
oct_num1 = oct_num1[1:]
print(sym + oct_num1 + '.' + oct_num2)
文章最后修订于 2020年8月31日
评论 (0)