Python - Применение дополнения двух к строке - PullRequest
1 голос
/ 13 октября 2010

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

Пример: 100010 переворачивается на 011101 и представляется в виде строки. Как бы вы применили дополнение к двум к строке 011101?

Одна часть этого, которая действительно меня озадачивает, - это если пользователь вводит двоичное число, которое, когда применяется дополнение к двум, включает в себя много переноса.

Ответы [ 3 ]

2 голосов
/ 13 октября 2010

Просто для разнообразия, вот еще один способ, основанный на том факте, что Дополнение Двойки определяется как Дополнение Единого плюс один. Это немного обманывает и преобразует значение строки дополнения промежуточного в целое число, чтобы добавить его к нему, а затем преобразует его обратно в двоичную строку, используя новую встроенную функцию bin(), добавленную в Python 2.6 .

def onescomp(binstr):
    return ''.join('1' if b=='0' else '0' for b in binstr)

def twoscomp(binstr):
    return bin(int(onescomp(binstr),2)+1)[2:]

print twoscomp('01001001') # prints 10110111
print twoscomp('011101')   # prints 100011
print twoscomp('001')      # prints 111
2 голосов
/ 13 октября 2010

Я бы просто сделал это как число, а затем преобразовал бы его обратно.

def tobin(x, count=8):
    # robbed from http://code.activestate.com/recipes/219300/
    return "".join(map(lambda y:str((x>>y)&1), range(count-1, -1, -1)))

def twoscomp(num_str):
    return tobin(-int(num_str,2),len(num_str))

print twoscomp('01001001') # prints 10110111
print twoscomp('1000')     # prints 1000 (because two's comp is cool like that)
print twoscomp('001')      # prints 111
1 голос
/ 14 октября 2010

Если вы хотите сделать это без преобразования обратно в число, начните с правой части строки, пока не найдете первую 1, затем переверните все символы влево.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...