Преобразование целого числа в двоичную строку дополнения до 2 со знаком - PullRequest
1 голос
/ 06 августа 2020

Прямо сейчас, насколько мне известно, все средства преобразования из int в двоичную битовую строку предназначены для беззнаковых преобразований (bin, format, et c.). Есть ли способ быстро преобразовать заданное целое число в соответствующую ему двоичную строку дополнения (используя минимальные биты)?

Например, я бы хотел, чтобы эта функция 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 более быстрый / сжатый код.

1 Ответ

3 голосов
/ 06 августа 2020

Ничего не встроено, но это более лаконично:

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'
...