2017-02-06 14 views
0

пытается взять список двоичных чисел и отобразить их «противоположности», im помещая это слово в кавычки, потому что я не уверен, что это лучший способ описать, что я имею в виду ,сделать двоичный номер его «противоположным» в python

board=[1,10,101] 

Я хочу сделать функцию, которая будет отображаться дополнение противоположностью этих чисел, как это:

newboard=[0,01,010] 

в основном обменивая 0 для 1 и 1 для 0. Поскольку они целые числа Я не могу перебирать каждое двоичное число и вручную изменять значение, я пытался использовать два комплимента, но это не делает семантически то, что я пытаюсь сделать. Кто-нибудь знает функцию для того, как это сделать, или что этот процесс будет вызван? благодаря!

+0

Вы не можете создать '01' целое либо (что бы просто' 1'). Он выглядит строками ilke, содержащими символы '1' и' 0', будет лучше подходит (в этот момент замена символов достаточно проста). –

+0

Посмотрите на преобразование в двоичный файл и затем переверните биты – nbryans

+3

Как '0b101^0b111 == 0b010'? Но обратите внимание, что вы увидите десятичное представление - '5^7 == 2'. У вас нет '0b101' в вашем списке, у вас' 101'. – jonrsharpe

ответ

0

Можете ли вы представить свои двоичные числа как строки? Тогда вы можете просто сделать следующее:

opposite = { '0':'1', '1':'0'} 
board=['1', '10', '101'] 
newboard = [''.join([opposite[c] for c in n]) for n in board] 
0

Вы не можете хранить [0, 01, 010] в списке, как это только будет [0, 1, 10] можно использовать строки, хотя

def reverse_binary(input): 
    reversed = [] 
    for x in [list(str(x)) for x in input]: 
     reversed.append(''.join(['%s' % (int(x)^1) for x in x])) 
    return reversed 


if __name__ == '__main__': 
    print(reverse_binary([1, 10, 101])) 
0

Вы можете поменять местами все нули и все нули внутри каждой строки. Чтобы сделать это, простую итерацию по списку и для каждого значения, создайте новую запись, заменяющую 1 и 0. Чтобы предварительно сформировать своп, замените «1» на значение, которое никогда не использовалось (например, «U»), назначить ' 0 'до' 1 'и присвойте временному значению' U '' 0 '.

newboard = [a.replace('1','U').replace('0','1').replace('U','0') for a in board] 
0

Я считаю, что вы имеете в виду только что называемые дополняющими числами; вы пытаетесь перевернуть цифры двоичных чисел. Естественно, что нужно использовать оператор XOR. Рассмотрим следующий фрагмент кода:

get_bin = lambda x: format(x, 'b') 
def Complement_binary(x): 
    complemented = [] 
    for num in x: 
     i = 1 
     while i <= num: 
      i = i << 1 
     complemented.append(get_bin((i - 1)^num)) 
    return complemented 

Complement_binary функция получает список чисел и возвращает список чисел в двоичном представлении в строках (get_bin преобразует число в двоичных чисел в строках). Если вам не нужны строки, вы можете удалить функцию get_bin в complemented.append(get_bin((i - 1)^num)).

Источник get_bin функции: https://stackoverflow.com/a/21732313/6833761 по @Martin Thoma