【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


相关文章
|
13天前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
117 67
|
6天前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
31 18
|
7天前
|
Python
Python中的函数
Python中的函数
21 8
|
14天前
|
监控 测试技术 数据库
Python中的装饰器:解锁函数增强的魔法####
本文深入探讨了Python语言中一个既强大又灵活的特性——装饰器(Decorator),它以一种优雅的方式实现了函数功能的扩展与增强。不同于传统的代码复用机制,装饰器通过高阶函数的形式,为开发者提供了在不修改原函数源代码的前提下,动态添加新功能的能力。我们将从装饰器的基本概念入手,逐步解析其工作原理,并通过一系列实例展示如何利用装饰器进行日志记录、性能测试、事务处理等常见任务,最终揭示装饰器在提升代码可读性、维护性和功能性方面的独特价值。 ####
|
21天前
|
Python
Python中的`range`函数与负增长
在Python中,`range`函数用于生成整数序列,支持正向和负向增长。本文详细介绍了如何使用`range`生成负增长的整数序列,并提供了多个实际应用示例,如反向遍历列表、生成倒计时和计算递减等差数列的和。通过这些示例,读者可以更好地掌握`range`函数的使用方法。
37 5
|
1月前
|
测试技术 数据安全/隐私保护 Python
探索Python中的装饰器:简化和增强你的函数
【10月更文挑战第24天】在Python编程的海洋中,装饰器是那把可以令你的代码更简洁、更强大的魔法棒。它们不仅能够扩展函数的功能,还能保持代码的整洁性。本文将带你深入了解装饰器的概念、实现方式以及如何通过它们来提升你的代码质量。让我们一起揭开装饰器的神秘面纱,学习如何用它们来打造更加优雅和高效的代码。
|
21天前
|
中间件 Docker Python
【Azure Function】FTP上传了Python Function文件后,无法在门户页面加载函数的问题
通过FTP上传Python Function至Azure云后,出现函数列表无法加载的问题。经排查,发现是由于`requirements.txt`中的依赖包未被正确安装。解决方法为:在本地安装依赖包到`.python_packages/lib/site-packages`目录,再将该目录内容上传至云上的`wwwroot`目录,并重启应用。最终成功加载函数列表。
|
7天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
6天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
13天前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
128 59