Python实现十进制数与二进制补码转换
Python实现十进制数与二进制补码转换
二进制补码(BNR)
正数
正整数的补码是其二进制表示,与原码相同。
例:+9的补码是00001001。(备注:这个+9的补码是用8位2进制来表示的,补码表示方式很多,还有16位二进制补码表示形式,以及32位二进制补码表示形式,64位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。)
负数
求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。
同一个数字在不同的补码表示形式中是不同的。比如-15的补码,在8位二进制中11110001,然而在16位二进制补码表示中,就是1111111111110001。以下都使用8位2进制来表示。
例:求-5的补码。
-5对应带符号位负数5(10000101)→除符号位外所有位取反(11111010)→加 00000001为 (11111011)所以-5的补码是11111011
示例代码
def dec2bnr(dec: int, lenth: int = 19) -> str:"""十进制数转指定长度二进制补码(BNR)Args:dec (int): 十进制数lenth (int, optional): 指定长度(正数高位补0,负数高位补1). Defaults to 19.Raises:TypeError: 输入非十进制整数!OverflowError: 输入十进制整数过大,超过指定补码长度Returns:str: 返回二进制补码字符串"""if not isinstance(dec, int):raise TypeError("输入非十进制整数!")# 计算十进制转化为二进制后的位数digits = (len(bin(dec)) - 3) if dec < 0 else (len(bin(dec)) - 2)if digits >= lenth:raise OverflowError("输入十进制整数过大,超过指定补码长度")# Note: dec & 相同位数的0b111...强制转换为补码形式pattern = f"{dec & int('0b' + '1' * lenth, 2):0{lenth}b}"return ",".join(code for code in pattern)
def bnr2dec(data: str) -> int:"""二进制补码(BNR)转十进制数Args:data (str): 二进制补码字符串,如"100101100"Raises:TypeError: 输入非字符串!ValueError: 输入非二进制字符串!Returns:int: 十进制数"""if not isinstance(data, str):raise TypeError("输入非字符串!")for num in data:if num not in ["0", "1"]:raise ValueError("输入非二进制字符串!")# 正整数原码与补码相同if data.startswith("0"):dec = int(data, 2)else:# 补码-->反码-->原码dec = int(data[1:], 2) - 0x01dec = -(~dec & int("0b" + "1" * (len(data) - 1), 2))# Note: 整数在计算机中以补码的形式存储,所以按位取反运算符(~)会将补码的符号位也取反,故用&运算符清零特性(任何数与0相与都为0,与1相与保持不变)# 即dec & 0b1111...(位数取决于dec的位数),0b1111在计算机中的存储的补码为01111,dec与之相与后符号位被清零,即可实现非计算机层面的按位取反return dec
单元测试
def test_dec2bnr() -> None:"""测试十进制整数转指定长度二进制补码"""with pytest.raises(TypeError):dec2bnr("128")with pytest.raises(OverflowError):dec2bnr(128, 6)assert dec2bnr(144, 14) == "0,0,0,0,0,0,1,0,0,1,0,0,0,0"assert dec2bnr(-2022) == "1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,0,1,0"
def test_bnr2dec() -> None:"""测试二进制补码转十进制数"""with pytest.raises(TypeError):bnr2dec(10010)with pytest.raises(ValueError):bnr2dec("s10010")assert bnr2dec("0000011111100110") == 2022assert bnr2dec("1111100000110010") == -1998
如有帮助到各位,请点赞+收藏+关注,谢谢
Python实现十进制数与二进制补码转换相关推荐
- Java中实现十进制数转换为二进制的几种办法
Java中实现十进制数转换为二进制 第一种:除基倒取余法 这是最符合我们平时的数学逻辑思维的,即输入一个十进制数n,每次用n除以2,把余数记下来,再用商去除以2...依次循环,直到商为0结束,把余数倒 ...
- Java中实现十进制数转换为二进制
Java中实现十进制数转换为二进制 第一种:除基倒取余法 这是最符合我们平时的数学逻辑思维的,即输入一个十进制数n,每次用n除以2,把余数记下来,再用商去除以2-依次循环,直到商为0结束,把余数倒着依 ...
- Python实现十进制整数与BCD码转换
Python实现十进制整数与BCD码转换 BCD码 8421BCD码是最基本和最常用的BCD码,它和四位自然二进制码相似,各位的权值为8.4.2.1,故称为有权BCD码.和四位自然二进制码不同的是,它 ...
- 语言栈十进制转十六进制_十进制数转二进制、八进制、十六进制等任意进制_C语言「抄作业」...
C语言「抄作业」系列之十进制数转二进制.八进制.十六进制等任意进制 PS: 写这篇时发现了潜藏多年的Bug.在修复时,无意间发现,本大仙当年的Bug代码竟然「流传甚广」--(别以为改了下变量名,就能骗 ...
- 利用栈实现把十进制数转换为二进制至十六进制之间的任一进制数并输出的功能。(第二版)
[实验题目内容] 保持计算机默认的十进制不变(要求不用C++流操纵符转换基数为八进制形式oct,不用C++流操纵符转换基数为十六进制形式hex,也不用setbase(base)函数将基数设置为base ...
- 利用栈实现把十进制数转换为二进制至十六进制之间的任一进制数并输出的功能。
利用栈实现把十进制数转换为二进制至十六进制之间的任一进制数并输出的功能. [实验题目内容] [实验环境](使用的软件):VS - 2010 [项目设计源代码] [项目测试运行结果截图] [实验题目内容 ...
- C++十进制数转换为二进制表示的算法(附完整源码)
C++十进制数转换为二进制表示的算法 C++十进制数转换为二进制表示的算法完整源码(定义,实现,main函数测试) C++十进制数转换为二进制表示的算法完整源码(定义,实现,main函数测试) #in ...
- 用python将十进制数转换成二进制数_python中的数据结构-将十进制数转换为二进制数...
二进制表示法在计算机科学中很重要,计算机中存储的所有值都以一串二进制数字,即0和1的形式存在. 如果无法在通用表示形式和二进制数字之间来回转换,我们将需要以非常奇怪的方式与计算机进行交互. 十进制的数 ...
- Python | 不使用库函数将十进制数转换为二进制
Given a decimal number and we have to convert it into binary without using library function. 给定一个十进制 ...
最新文章
- O-GAN:简单修改,让GAN的判别器变成一个编码器!
- HTML5 如何实现拖放'N'拖放
- centOS+uwsgi+nginx 部署flask项目,问题记录
- 菜鸟教程:SQL 通用数据类型
- raptor五个数排序流程图_数据结构与算法(一):排序(上)
- dos下实现延迟功能
- JVM中的垃圾收集算法和Heap分区简记
- 【学习笔记】rabbitmq设置队列ttl和使用延迟插件的代码示例
- cobalt strick 4.0 系列教程(6)Payload Artifact 和反病毒规避
- python 3中 的subprocess
- (21)System Verilog按时间顺序的通知需求(变量驱动)
- 怎么增加一个工位?ApiPost工位有什么用?
- pt-query-digest分析mysql日志
- Linux-完美解决linux系统镜像下载速度慢的问题
- php抽奖简单源码,php转盘抽奖 完整例子源码(含模拟数据)
- 2021年中国石油沥青供需及发展趋势分析[图]
- CSR867x — 使用Sink Configuration Tool配置按键
- 如何用爬虫工具实现竞对价格监控
- 中英文排版字符间距不一致,英文自动断字
- 最佳线程数和QPS以及RT