2017-01-10 15 views
0

В настоящее время я выполняю проект по двоичным операторам. Прямо сейчас у меня есть два списка с чередой строк с 8 бит 1 с и 0. Скажем, у меня есть этот код (представление о том, что получается, когда я создаю два массива):«Неподдерживаемый тип операндов для ^: 'str' и 'str'" с Binary в Python 3.x

arr1 = ['0b01110101', '0b00001111', '0b01001101'] 
arr2 = ['0b10010100', '0b00000101', '0b00111001'] 
arr3 = [] 

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

for i in len(arr1): 
    arr3[i] = arr1[i]^arr2[i] 

Когда я запускаю этот код, я получаю сообщение об ошибке:

Unsupported operand type(s) for ^: 'str' and 'str' 

Я пытался сделать это:

arr3[i] = bin(arr1[i])^bin(arr2[i]) 

и возвращает эту ошибку сообщение:

TypeError: 'str' object cannot be interpreted as an integer 

Как я могу получить aroun d это?

EDIT 1: Это не дубликат того, что было отмечено в комментариях. Я не смотрю, как делать обычную двоичную функцию XOR. Я знаю, как это сделать. Я ищу способ преобразования этих строк в двоичные числа, чтобы я мог использовать на них оператор XOR.

+0

поверг их Интс. 'int ('0b00111001', 2) == 57'. Все побитовые операторы работают для ints. –

+0

Вы прочитали эти два ответа, чтобы узнать, помогает ли он ответить на ваш вопрос: [здесь] (http://stackoverflow.com/questions/19414093/how-to-xor-binary-with-python) и [здесь] (http : //stackoverflow.com/questions/2612720/how-to-do-bitwise-exclusive-or-of-two-strings-in-python) – idjaw

+0

Возможный дубликат [как для xor binary с python] (http: // stackoverflow.com/questions/19414093/how-to-xor-binary-with-python) –

ответ

2

Попробуйте это:

arr1 = ['0b01110101', '0b00001111', '0b01001101'] 
arr2 = ['0b10010100', '0b00000101', '0b00111001'] 
arr3 = [] 

for i, _ in enumerate(arr1): 
    xor = int(arr1[i], 2)^int(arr2[i], 2) 
    arr3.append("0b{0:08b}".format(xor)) 

Выход:

['0b11100001', '0b00001010', '0b01110100'] 
+0

Это работает. Спасибо! –

+1

рассмотрите возможность прокрутки списков, чтобы избежать индексированного доступа: 'для a1, a2 в zip (arr1, arr2):'. в противном случае хорошо. –

0

bin представляет собой строковое представление целого числа. Вы не можете использовать строки XOR.

Вобщ целое преобразование, основание 2, преобразование понимает целое, с 0b или без него:

for a1,a2 in zip(arr1,arr2): 
    print(bin(int(a1,2)^int(a2,2))) 

результат:

0b11100001 
0b1010 
0b1110100 
+0

Можете ли вы объяснить, как это работает? Например, почему вторая появляется только как 4 бита длиной, а не всего 8 бит? –

+0

Это из-за формата и небольшого размера. Как говорится в другом ответе, «0b {0: 08b}» - это формат, который добавляет нули. –

0

Вы могли бы конец цитаты списков

arr1 = ['0b01110101', '0b00001111', '0b01001101'] 
arr2 = ['0b10010100', '0b00000101', '0b00111001'] 
arr3 = [] 

А также исправить ошибку в цикле и использовать append и range для итераций.

for i in range(len(arr1)):  # xrange for Pyhon2 
    arr3.append(int(arr1[i], 2)^int(arr2[i], 2)) 
+0

Я не могу фактически игнорировать списки.По тому, как я их генерирую, используя мой цикл, они отображаются в списках с кавычками вокруг них. –

+0

Кастинг каждого, как Жан-Франсуа Фабр сказал и исправить петлю, все равно изменит ответ, чтобы соответствовать этому новому требованию. –