python - 将整数转换为有符号 2 的补码二进制字符串
问题描述
目前,据我所知,从 int 到二进制位字符串的所有转换方法都是用于无符号转换(bin
,format
等)。有没有办法将给定的整数快速转换为其对应的 2 的补码位串(使用最少的位)?
例如,我希望这个函数f
输出:
f(-4) = '100'
f(5) = '0101'
f(-13) = '10011'
现在,我的实现是这里的代码:
def f(x):
"""Convert decimal to two's complement binary string"""
if x < 0:
bs = bin(x)[3:]
bs_pad = zero_pad(bs, roundup(tc_bits(x)))
return bin((int(invert(bs_pad),2) + 1))#negate and add 1
else: #Positive- sign bit 0.
bs = bin(x)[2:]
return "0b" + zero_pad(bs, roundup(tc_bits(x)))
它基本上跟踪转换过程的每个步骤 - 零填充,否定,加 1,然后转换回二进制(它实际上还确保位宽是四的倍数)。这写起来超级乏味,我想知道 Python 是否支持更快/更简洁的代码方式。
解决方案
没有内置任何东西,但这更简洁:
def f(n):
nbits = n.bit_length() + 1
return f"{n & ((1 << nbits) - 1):0{nbits}b}"
然后,例如,
>>> f(0)
'0'
>>> f(1)
'01'
>>> f(2)
'010'
>>> f(3)
'011'
>>> f(-1)
'11'
>>> f(-2)
'110'
>>> f(-3)
'101'
推荐阅读
- css - 仅在移动设备上裁剪的元素 - 发生了什么?
- php - 从 PHP 中的 sshseclib 日志输出行中删除退格字符
- angular - 使用依赖的下拉菜单初始化 formGroup
- php - 如何将值从一个表单字段转移到 Laravel 中的另一个字段?
- google-chrome - 如何从 Outlook 加载项 (Office 365) 在 Chrome 浏览器中打开链接?
- javascript - 函数组件不支持 contextType
- java - 带有桌面应用程序的 Sqlite 数据
- javascript - 带有文件的表单-上传到 Json-字符串到 JavaBackend
- ansible - 将 module_defaults 属性应用于角色
- excel - VBA Range_Copy 宏 - 如何将相同的任务应用于后续行