【python】bin/dec/hex/bnr进制转换函数及fp32转十六进制

 

 我们的目标是┏ (゜ω゜)=☞芯片前端全栈工程师~喵!

前言

不知道为什么,给脚本专栏选的这个logo有种怪怪的感觉(⊙o⊙)…

为方便后续一些脚本工作,将常用的进制转换函数汇总。所有函数均为字符串输入输出,且不加0x、0b等关键字,以便后续灵活调用。基于这些字符串输入输出的函数,可以非常灵活的根据需求拼接更加复杂的行为:

TO->>>十进制二进制源码二进制补码十六进制
十进制 dec_to_bindec_to_bnrdec_to_hex
二进制源码bin_to_dec bin_to_bnrbin_to_hex
二进制补码bnr_to_decbnr_to_bin bnr_to_hex
十六进制hex_to_dechex_to_binhex_to_bnr 
FP32   float_to_hex

函数

dec_to_bin

十进制转二进制源码:

def dec_to_bin(i: str) -> str:
	if not isinstance(i, str):
		raise TypeError("Not str input")
	return format(int(i),'b')#08b

测试:

print(dec_to_bin("10"))
print(dec_to_bin("-10"))

1010
-1010

dec_to_bnr

十进制转二进制补码,我参考了网上的代码,稍作修改:

def dec_to_bnr(i: int, lenth: int = 1) -> str:
	if not isinstance(i, str):
		raise TypeError("Not str input")
	dec = int(i)
	digits = (len(bin(dec)) - 3 + 1) if dec < 0 else (len(bin(dec)) - 2)
	if digits >= lenth:
		lenth = digits
	pattern = f"{dec & int('0b' + '1' * lenth, 2):0{lenth}b}"
	return "".join(code for code in pattern)

测试:

print(dec_to_bnr("10"))
print(dec_to_bnr("-10"))

1010
10110

dec_to_hex

十进制转十六进制:

def dec_to_hex(i: str) -> str:
	if not isinstance(i, str):
		raise TypeError("Not str input")
	if i.startswith("-"):
		i = re.sub("-", "", i)
		return "-" + str(hex(int(i)))[2:]
	else:
		return str(hex(int(i)))[2:]

测试:

print(dec_to_hex("10"))
print(dec_to_hex("-10"))

a
-a

bin_to_dec

 二进制转十进制:

def bin_to_dec(i: str) -> str:
	if not isinstance(i, str):
		raise TypeError("Not str input")
	return str(int(str(i), 2))

测试:

print(bin_to_dec("0101"))
print(bin_to_dec("-0101"))

5
-5

bin_to_bnr

二进制源码转二进制补码:

def bin_to_bnr(i: str) -> str:
	return dec_to_bnr(bin_to_dec(i))

测试:

print(bin_to_bnr("1010"))
print(bin_to_bnr("-1010"))

1010
10110

bin_to_hex

二进制原码转十六进制:

def bin_to_hex(i: str) -> str:
	if not isinstance(i, str):
		raise TypeError("Not str input")
	if i.startswith("-"):
		i = re.sub("-", "", i)
		return "-" + str(hex(int(i, 2)))[2:]
	else:
		return str(hex(int(i, 2)))[2:]

测试:

print(bin_to_hex("1010"))
print(bin_to_hex("-1010"))

a
-a

bnr_to_dec

二进制补码转十进制,也是在参考了网上的代码:

def bnr_to_dec(i: str) -> str:
	if not isinstance(i, str):
		raise TypeError("Not str input")
	for num in i:
		if num not in ["0", "1"]:
			raise ValueError("Not bin str")
	if i.startswith("0"):
		dec = int(i, 2)
	else:
		dec = int(i[1:], 2) - 0x01
		dec = -(~dec & int("0b" + "1" * (len(i) - 1), 2))
	return str(dec)

测试:

print(bnr_to_dec("010011"))
print(bnr_to_dec("1010011"))

19
-45

bnr_to_bin

二进制补码转二进制原码:

def bnr_to_bin(i: str) -> str:
	return dec_to_bin(bnr_to_dec(i))

bnr_to_hex

二进制补码转十六进制,这个场景必然是要把补码还原为原本的数,再显示十六进制,否则直接用bin_to_hex就够了:

def bnr_to_hex(i: str) -> str:
	return dec_to_hex(bnr_to_dec(i))

测试:

print(bnr_to_hex("10100"))
print(bnr_to_hex("01001"))

-c
9

hex_to_dec

十六进制转十进制:

def hex_to_dec(i: str) -> str:
	if not isinstance(i, str):
		raise TypeError("Not str input")
	return str(int(i, 16))

测试:

print(hex_to_dec("a"))
print(hex_to_dec("-a"))

10
-10

hex_to_bin

十六进制转二进制:

def hex_to_bin(i: str) -> str:
	return dec_to_bin(hex_to_dec(i))

hex_to_bnr

十六进制转补码:

def hex_to_bnr(i: str) -> str:
	return dec_to_bnr(hex_to_dec(i))

float_to_hex

fp32(float)类型转十六进制,这个也是从网上学来的(感恩家人!):

import struct
def float_to_hex(i: str) -> str:
	f = float(i)
	h = hex(struct.unpack('<I', struct.pack('<f', f))[0])
	return str(h)[2:]

测试:

print(float_to_hex("17.5"))
print(float_to_hex("-17.5"))

418c0000
c18c0000
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尼德兰的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值