【问题标题】:Converting an integer to signed 2's complement binary string将整数转换为有符号 2 的补码二进制字符串
【发布时间】:2020-11-26 04:52:01
【问题描述】:

目前,据我所知,从 int 到二进制位字符串的所有转换方法都是用于 unsigned 转换(binformat 等)。有没有办法将给定的整数快速转换为对应的 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 是否支持更快/更简洁的代码方式。

【问题讨论】:

  • 是的,这是我的错误,已编辑

标签: python binary decimal twos-complement


【解决方案1】:

没有内置,但这更简洁:

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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-13
    • 2016-07-16
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多