Бинарное дополнение, которое не одобряет ношение - PullRequest
0 голосов
/ 11 ноября 2018

В настоящее время я работаю с двоичным сложением, которое возвращает False, если есть перенос. Мой текущий код:

def binaryadd(one, other):
    str_1, str_2 = str(one), str(other)
    for a,b in zip(str_1[::-1], str_2[::-1]):
        if a == b == '1':
            return False
    return int(bin(rev_bin(one) + rev_bin(other))[2:])

, поэтому 10111 + 1000 вернет 11111, 10110 + 1011 вернет False. Я думаю, что были бы более эффективные коды, такие как проверка переполнения в дополнение, но мне интересно, какой код мог бы сделать это. Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 11 ноября 2018

Имеется перенос с того момента, как есть «столбец», для которого оба операнда имеют 1, поскольку в этом случае мы генерируем перенос. Перенос также может распространяться , но только в том случае, если перенос уже был создан.

Мы можем проверить это поразрядно и (&). Если нет переноса, мы можем просто поразрядно или (|):

def binaryadd(one, other):
    if <b>one & other</b>:
        return False
    return <b>one | other</b>

или в одну строку:

def binaryadd(one, other):
    return not bool(one & other) and one | other
...