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

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


前言

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


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

TO->>>

十进制

二进制源码

二进制补码

十六进制

十进制


dec_to_bin

dec_to_bnr

dec_to_hex

二进制源码

bin_to_dec


bin_to_bnr

bin_to_hex

二进制补码

bnr_to_dec

bnr_to_bin


bnr_to_hex

十六进制

hex_to_dec

hex_to_bin

hex_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


相关文章
|
3月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
293 1
|
3月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
368 1
|
3月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
218 0
|
4月前
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
296 101
|
4月前
|
缓存 测试技术 Python
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
241 99
|
4月前
|
存储 缓存 测试技术
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
214 98
|
4月前
|
缓存 Python
Python中的装饰器:优雅地增强函数功能
Python中的装饰器:优雅地增强函数功能
|
算法 Python 容器
Python编程 - 不调用相关choose库函数,“众数“挑选器、随机挑选器 的源码编程实现
Python编程 - 不调用相关choose库函数,“众数“挑选器、随机挑选器 的源码编程实现
266 0
|
算法 Python
Python编程的函数—内置函数
Python编程的函数—内置函数
228 0
|
算法 Python
Python编程实验四:函数的使用
Python编程实验四:函数的使用
274 0