【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

十进制转二进制源码:

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

测试:

1. print(dec_to_bin("10"))
2. print(dec_to_bin("-10"))
3. 
4. 1010
5. -1010

dec_to_bnr

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

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

测试:

1. print(dec_to_bnr("10"))
2. print(dec_to_bnr("-10"))
3. 
4. 1010
5. 10110

dec_to_hex

十进制转十六进制:

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

测试:

1. print(dec_to_hex("10"))
2. print(dec_to_hex("-10"))
3. 
4. a
5. -a

bin_to_dec

二进制转十进制:

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

测试:

1. print(bin_to_dec("0101"))
2. print(bin_to_dec("-0101"))
3. 
4. 5
5. -5

bin_to_bnr

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

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

测试:

1. print(bin_to_bnr("1010"))
2. print(bin_to_bnr("-1010"))
3. 
4. 1010
5. 10110

bin_to_hex

二进制原码转十六进制:

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

测试:

1. print(bin_to_hex("1010"))
2. print(bin_to_hex("-1010"))
3. 
4. a
5. -a

bnr_to_dec

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

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

测试:

1. print(bnr_to_dec("010011"))
2. print(bnr_to_dec("1010011"))
3. 
4. 19
5. -45

bnr_to_bin

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

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

bnr_to_hex

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

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

测试:

1. print(bnr_to_hex("10100"))
2. print(bnr_to_hex("01001"))
3. 
4. -c
5. 9

hex_to_dec

十六进制转十进制:

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

测试:

1. print(hex_to_dec("a"))
2. print(hex_to_dec("-a"))
3. 
4. 10
5. -10

hex_to_bin

十六进制转二进制:

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

hex_to_bnr

十六进制转补码:

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

float_to_hex

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

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

测试:

1. print(float_to_hex("17.5"))
2. print(float_to_hex("-17.5"))
3. 
4. 418c0000
5. c18c0000


相关文章
|
21天前
|
Python
Python之函数详解
【10月更文挑战第12天】
Python之函数详解
|
22天前
|
存储 数据安全/隐私保护 索引
|
11天前
|
测试技术 数据安全/隐私保护 Python
探索Python中的装饰器:简化和增强你的函数
【10月更文挑战第24天】在Python编程的海洋中,装饰器是那把可以令你的代码更简洁、更强大的魔法棒。它们不仅能够扩展函数的功能,还能保持代码的整洁性。本文将带你深入了解装饰器的概念、实现方式以及如何通过它们来提升你的代码质量。让我们一起揭开装饰器的神秘面纱,学习如何用它们来打造更加优雅和高效的代码。
|
13天前
|
弹性计算 安全 数据处理
Python高手秘籍:列表推导式与Lambda函数的高效应用
列表推导式和Lambda函数是Python中强大的工具。列表推导式允许在一行代码中生成新列表,而Lambda函数则是用于简单操作的匿名函数。通过示例展示了如何使用这些工具进行数据处理和功能实现,包括生成偶数平方、展平二维列表、按长度排序单词等。这些工具在Python编程中具有高度的灵活性和实用性。
|
16天前
|
Python
python的时间操作time-函数介绍
【10月更文挑战第19天】 python模块time的函数使用介绍和使用。
22 4
|
17天前
|
存储 Python
[oeasy]python038_ range函数_大小写字母的起止范围_start_stop
本文介绍了Python中`range`函数的使用方法及其在生成大小写字母序号范围时的应用。通过示例展示了如何利用`range`和`for`循环输出指定范围内的数字,重点讲解了小写和大写字母对应的ASCII码值范围,并解释了`range`函数的参数(start, stop)以及为何不包括stop值的原因。最后,文章留下了关于为何`range`不包含stop值的问题,留待下一次讨论。
15 1
|
17天前
|
安全 数据处理 数据安全/隐私保护
python中mod函数怎么用
通过这些实例,我们不仅掌握了Python中 `%`运算符的基础用法,还领略了它在解决实际问题中的灵活性和实用性。在诸如云计算服务提供商的技术栈中,类似的数学运算逻辑常被应用于数据处理、安全加密等关键领域,凸显了基础运算符在复杂系统中的不可或缺性。
15 0
|
1天前
|
Python
不容错过!Python中图的精妙表示与高效遍历策略,提升你的编程艺术感
本文介绍了Python中图的表示方法及遍历策略。图可通过邻接表或邻接矩阵表示,前者节省空间适合稀疏图,后者便于检查连接但占用更多空间。文章详细展示了邻接表和邻接矩阵的实现,并讲解了深度优先搜索(DFS)和广度优先搜索(BFS)的遍历方法,帮助读者掌握图的基本操作和应用技巧。
13 4
|
1天前
|
设计模式 程序员 数据处理
编程之旅:探索Python中的装饰器
【10月更文挑战第34天】在编程的海洋中,Python这艘航船以其简洁优雅著称。其中,装饰器作为一项高级特性,如同船上的风帆,让代码更加灵活和强大。本文将带你领略装饰器的奥秘,从基础概念到实际应用,一起感受编程之美。
|
3天前
|
存储 人工智能 数据挖掘
从零起步,揭秘Python编程如何带你从新手村迈向高手殿堂
【10月更文挑战第32天】Python,诞生于1991年的高级编程语言,以其简洁明了的语法成为众多程序员的入门首选。从基础的变量类型、控制流到列表、字典等数据结构,再到函数定义与调用及面向对象编程,Python提供了丰富的功能和强大的库支持,适用于Web开发、数据分析、人工智能等多个领域。学习Python不仅是掌握一门语言,更是加入一个充满活力的技术社区,开启探索未知世界的旅程。
13 5