注意:本文只针对整数进制之间的转化。后期会更新浮点型的进制转化。
1、十进值转二进制、八进制、十六进制
1.1 十进制转二进制
按权展开。除二取余,直到商为0。逆序写出取余。
图1
python中实现代码如下:
# ----------------------二进制与十进制的转化---------------------------
def Decimalism2Binary(self):
"""十进制转二进制"""
# 定义一个列表来存储二进制
n = self.Decimalism
Binary_list = ''
while True:
temp, sod = int(n / 2), n % 2
Binary_list = Binary_list + str(sod)
if temp == 0:
break
n = temp
return Binary_list[::-1]
1.2 十进制转八进制
按权展开。除8取余,直到商为0。逆序写出取余。见图1
# --------------------十进制转八进制-----------------------
def Decialism2octal(self):
"""由于用二进制表示的数的位数长,书写不 便,为了便于书写常采用八进制(Octal Q)和十六进制 (Hexadecimal)作为中间进制。"""
temp = ""
n = self.Decimalism
while True:
m, sod = int(n / 8), n % 8
temp += str(sod)
if m == 0:
break
n = m
return temp[::-1]
1.3 十进制转十六进制
按权展开。除16取余,直到商为0。逆序写出取余。见图1
# --------------------十进制与十六进制的转化---------------------------
def Decimalism2hexadecimal(self):
"""十进制->十六进制"""
n = self.Decimalism
hexadecimal = ''
while True:
temp, sod = int(n / 16), n % 16
if sod < 10:
hexadecimal += str(sod)
else:
hexadecimal += self.hexadecimal_index[str(sod)]
if temp == 0:
break
n = temp
return hexadecimal[::-1]
2、 二进制转十进制、八进制、十六进制
2.1 二进制转十进制
从后往前每个二进制数×2的0,1,2,3····次方,依次往前推。
图2
python代码实现
def Binary2Dcimaalism(self, binary):
"""二进制转十进制"""
line_binary = len(binary)
temp = 0
m = 0
for i in binary[::-1]:
temp += int(i) * pow(2, m)
m += 1
if m == line_binary:
break
return temp
2.2 二进制转八进制
从后往前每个三个为一组,对于每个组中从后往前,每个二进制数×2的0,1,2,3····次方,依次往前推。
图 3
Python代码实现
def Binary2octal(self, binary_str):
new_str = binary_str[::-1]
"""二进制转八进制"""
temp = ""
for i in range(len(binary_str)):
temp_1 = 0
if i == 0 or i % 3 == 0:
m = new_str[i:i + 3:1]
p = 0
for j in m:
temp_1 += int(j) * pow(2, p)
p += 1
temp += str(temp_1)
return temp[::-1]
2.3 二进制转十六进制
从后往前每4个二进制为一组,按照转八进制的计算方法。对于每个组中从后往前,每个二进制数×2的0,1,2,3····次方,依次往前推。
Python代码实现
def Binary2hexadecilam(self, binary_str):
"""二进制转十六进制"""
new_str = binary_str[::-1]
temp = ""
for i in range(len(binary_str)):
temp_1 = 0
if i == 0 or i % 4 == 0:
m = new_str[i:i + 4:1]
count = 0
for j in m:
temp_1 += int(j) * pow(2, count)
count += 1
if temp_1 < 10:
temp += str(temp_1)
else:
temp += self.hexadecimal_index[str(temp_1)]
return temp[::-1]
3、八进制、十六进制转十进制
3.1 八进制转十进制
如同二进制转十进制。从后往前每个八进制数×8的0,1,2,3·······次方,依次往前推。
python代码实现
def Octal2decilism(self, octal_num):
"""八进制转十进制"""
m = 0
temp = 0
for i in octal_num[::-1]:
temp += int(i) * pow(8, m)
m += 1
return temp
3.2 十六进制转十进制
如同二进制转十进制。从后往前每个八进制数×16的0,1,2,3·······次方,依次往前推。
python代码实现
def Hexadecimal2decimalism(self, hexadecimal_num):
"""十六进制转十进制"""
m = 0
temp = 0
for i in hexadecimal_num[::-1]:
if i in self.Alphabet_num.keys():
temp += int(self.Alphabet_num[i]) * pow(16, m)
else:
temp += int(i) * pow(16, m)
# if m == len(hexadecimal_num):
# break
m += 1
return temp
4、八进制、十六进制转二进制
4.1 八进制转二进制
每个八进制数按权展开。除二取余,直到商为0。逆序写出取余。三个为一组按八进制的顺序连接起来。
def Octal2binary(self, octal_num):
"""八进制转二进制"""
octal_str = str(octal_num)
temp = '' # 用来存放转化出来的数
for i in octal_str:
temp_1 = ''
while True:
m, sod = int(int(i) / 2), int(i) % 2
temp_1 += str(sod)
if m == 0:
break
i = m
if len(temp_1) < 3:
temp_1 = '0' * (3 - len(temp_1)) + temp_1[::-1]
temp += temp_1
else:
temp += temp_1[::-1]
if temp[0] == '0':
temp_list = list(temp)
del temp_list[0]
if temp_list[0] == '0':
del temp_list[0]
return ''.join(temp_list)
4.2 十六进制转二进制
每个十六进制数按权展开。除二取余,直到商为0。逆序写出取余。每四个为一组按八进制的顺序连接起来。
def Hexadecimal2binary(self, hexadecilism_str):
"""十六进制转二进制"""
temp = ""
for i in hexadecilism_str:
temp_1 = ''
if i in self.Alphabet_num.keys():
m = self.Alphabet_num[i]
while True:
g, sod = int(int(m) / 2), int(m) % 2
temp_1 += str(sod)
if g == 0:
break
m = g
else:
while True:
n, sod = int(int(i) / 2), int(i) % 2
temp_1 += str(sod)
if n == 0:
break
i = n
if len(temp_1) < 4:
temp_1 = '0'* (4-len(temp_1)) + temp_1[::-1]
temp += temp_1
else:
temp += temp_1[::-1]
if temp[0] == '0':
temp_list = list(temp)
del temp_list[0]
if temp_list[0]=='0':
del temp_list[0]
if temp_list[0] == '0':
del temp_list[0]
if temp_list[0] == '0':
del temp_list[0]
return ''.join(temp_list)
5 、八进制和十六进制之间的转化
这个两个进制之间不能直接转化,需要借助二进制来完成。
5.1 八进制转十六进制
def Octal2hexadecilam(self, octal_str):
"""八进制转十六进制"""
# 先把八进制转二进制,再转十六进制
oct2bin = self.Octal2binary(octal_str)
# 2.二进制转十六进制
return self.Binary2hexadecilam(oct2bin)
5.2 十六进制转二进制
def Hexadecilam2octal(self, hexadeilism_str):
"""十六进制转八进制"""
# 十六进制转二进制,再转八进制
hexad2binary_str = self.Hexadecimal2binary(hexadeilism_str)
return self.Binary2octal(hexad2binary_str)
6、完整代码
# -*- coding:utf-8 -*-
"""
作者:lihua
日期:年09月06日
"""
import math
class Decimal_Coversion(object):
def __init__(self, Decimalism):
self.Decimalism = Decimalism
self.hexadecimal_index = {"10": "a",
"11": "b",
"12": "c",
"13": "d",
"14": "e",
"15": "f"}
# 转化一下十六进制的键值
self.Alphabet_num = {v: k for k, v in self.hexadecimal_index.items()}
# ----------------------二进制与十进制的转化---------------------------
def Decimalism2Binary(self):
"""十进制转二进制"""
# 定义一个列表来存储二进制
n = self.Decimalism
Binary_list = ''
while True:
temp, sod = int(n / 2), n % 2
Binary_list = Binary_list + str(sod)
if temp == 0:
break
n = temp
return Binary_list[::-1]
def Binary2Dcimaalism(self, binary):
"""二进制转十进制"""
line_binary = len(binary)
temp = 0
m = 0
for i in binary[::-1]:
temp += int(i) * pow(2, m)
m += 1
if m == line_binary:
break
return temp
# --------------------十进制与十六进制的转化---------------------------
def Decimalism2hexadecimal(self):
"""十进制->十六进制"""
n = self.Decimalism
hexadecimal = ''
while True:
temp, sod = int(n / 16), n % 16
if sod < 10:
hexadecimal += str(sod)
else:
hexadecimal += self.hexadecimal_index[str(sod)]
if temp == 0:
break
n = temp
return hexadecimal[::-1]
def Hexadecimal2decimalism(self, hexadecimal_num):
"""十六进制转十进制"""
m = 0
temp = 0
for i in hexadecimal_num[::-1]:
if i in self.Alphabet_num.keys():
temp += int(self.Alphabet_num[i]) * pow(16, m)
else:
temp += int(i) * pow(16, m)
# if m == len(hexadecimal_num):
# break
m += 1
return temp
# --------------------十进制转八进制-----------------------
def Decialism2octal(self):
"""由于用二进制表示的数的位数长,书写不 便,为了便于书写常采用八进制(Octal Q)和十六进制 (Hexadecimal)作为中间进制。"""
temp = ""
n = self.Decimalism
while True:
m, sod = int(n / 8), n % 8
temp += str(sod)
if m == 0:
break
n = m
return temp[::-1]
def Octal2decilism(self, octal_num):
"""八进制转十进制"""
m = 0
temp = 0
for i in octal_num[::-1]:
temp += int(i) * pow(8, m)
m += 1
return temp
# --------------------十进制转二进制-----------------------
def Octal2binary(self, octal_num):
"""八进制转二进制"""
octal_str = str(octal_num)
temp = '' # 用来存放转化出来的数
for i in octal_str:
temp_1 = ''
while True:
m, sod = int(int(i) / 2), int(i) % 2
temp_1 += str(sod)
if m == 0:
break
i = m
if len(temp_1) < 3:
temp_1 = '0' * (3 - len(temp_1)) + temp_1[::-1]
temp += temp_1
else:
temp += temp_1[::-1]
if temp[0] == '0':
temp_list = list(temp)
del temp_list[0]
if temp_list[0] == '0':
del temp_list[0]
return ''.join(temp_list)
def Binary2octal(self, binary_str):
new_str = binary_str[::-1]
"""二进制转八进制"""
temp = ""
for i in range(len(binary_str)):
temp_1 = 0
if i == 0 or i % 3 == 0:
m = new_str[i:i + 3:1]
p = 0
for j in m:
temp_1 += int(j) * pow(2, p)
p += 1
temp += str(temp_1)
return temp[::-1]
# --------------------十六进制转二进制-----------------------
def Hexadecimal2binary(self, hexadecilism_str):
"""十六进制转二进制"""
temp = ""
for i in hexadecilism_str:
temp_1 = ''
if i in self.Alphabet_num.keys():
m = self.Alphabet_num[i]
while True:
g, sod = int(int(m) / 2), int(m) % 2
temp_1 += str(sod)
if g == 0:
break
m = g
else:
while True:
n, sod = int(int(i) / 2), int(i) % 2
temp_1 += str(sod)
if n == 0:
break
i = n
if len(temp_1) < 4:
temp_1 = '0'* (4-len(temp_1)) + temp_1[::-1]
temp += temp_1
else:
temp += temp_1[::-1]
if temp[0] == '0':
temp_list = list(temp)
del temp_list[0]
if temp_list[0]=='0':
del temp_list[0]
if temp_list[0] == '0':
del temp_list[0]
if temp_list[0] == '0':
del temp_list[0]
return ''.join(temp_list)
def Binary2hexadecilam(self, binary_str):
"""二进制转十六进制"""
new_str = binary_str[::-1]
temp = ""
for i in range(len(binary_str)):
temp_1 = 0
if i == 0 or i % 4 == 0:
m = new_str[i:i + 4:1]
count = 0
for j in m:
temp_1 += int(j) * pow(2, count)
count += 1
if temp_1 < 10:
temp += str(temp_1)
else:
temp += self.hexadecimal_index[str(temp_1)]
return temp[::-1]
# --------------------十六进制转八进制-----------------------
def Octal2hexadecilam(self, octal_str):
"""八进制转十六进制"""
# 先把八进制转二进制,再转十六进制
oct2bin = self.Octal2binary(octal_str)
# 2.二进制转十六进制
return self.Binary2hexadecilam(oct2bin)
def Hexadecilam2octal(self, hexadeilism_str):
"""十六进制转八进制"""
# 十六进制转二进制,再转八进制
hexad2binary_str = self.Hexadecimal2binary(hexadeilism_str)
return self.Binary2octal(hexad2binary_str)
def procing(self):
print("-" * 100)
binary_num = self.Decimalism2Binary()
decimalism_num = self.Binary2Dcimaalism(binary_num)
print(f"十进制({self.Decimalism})转二进制:{binary_num} ")
print(f'二进制{binary_num}转十进制:{decimalism_num}')
print("-" * 100)
hexadecimal = self.Decimalism2hexadecimal()
print(f'十进制{self.Decimalism}转十六进制:{hexadecimal}')
hexade2decima = self.Hexadecimal2decimalism(hexadecimal)
print(f'十六进制{hexadecimal}转十进制:{hexade2decima}')
print("-" * 100)
octal_num = self.Decialism2octal()
print(f'十进制{self.Decimalism}转八进制:{octal_num}')
octal2deci_num = self.Octal2decilism(octal_num)
print(f'八进制{octal_num}转十进制:{octal2deci_num}')
print("-" * 100)
octal2binary_str = self.Octal2binary(octal_num)
print(f'八进制{octal_num}转二进制:{octal2binary_str}')
octal_str = self.Binary2octal(octal2binary_str)
print(f'二进制{octal2binary_str}转八进制:{octal_str}')
print("-" * 100)
hexadecilism2binary_num = self.Hexadecimal2binary(hexadecimal)
print(f'十六进制{hexadecimal}转二进制:{hexadecilism2binary_num}')
binary2hexadecilism_str = self.Binary2hexadecilam(hexadecilism2binary_num)
print(f'二进制{hexadecilism2binary_num}转十六进制:{binary2hexadecilism_str}')
print("-" * 100)
oct2hexad = self.Octal2hexadecilam(octal_num)
print(f'八进制{octal_num}转十六进制:{oct2hexad}')
hex2oct_str = self.Hexadecilam2octal(oct2hexad)
print(f'十六进制{octal_num}转八进制:{hex2oct_str}')
if __name__ == '__main__':
# decimalism = int(input('请输入一个十进制数(整数):'))
# print(type(decimalism))
decimalism = 2022
cov = Decimal_Coversion(decimalism)
# 给定一个数
cov.procing()
6.1 上述代码运行结果
本文中的代码只是将十进制2022作为输入。如果需要将其他进制作为输入。需要修改调用进制。
遇到什么问题,可以联系本人(vx:lhkust299)。