В настоящее время я делаю проект по бинарным операторам. Прямо сейчас у меня есть два списка с последовательностями строк с 8 битами 1 и 0. Допустим, у меня есть этот код (представление того, что создается при создании двух массивов):

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

Как бы мне обойти это?

РЕДАКТИРОВАТЬ 1: Это не дубликат того, что было помечено, как в комментариях. Я не смотрю, как сделать нормальную двоичную функцию XOR. Я знаю, как это сделать. Я ищу способ преобразовать эти строки в двоичные числа, чтобы я мог использовать оператор XOR на них.

1
Tom Howells 10 Янв 2017 в 17:25

3 ответа

Лучший ответ

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

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']
2
irbis 10 Янв 2017 в 14:42

Вы можете расстаться со списками

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
Rafael Aguilar 10 Янв 2017 в 14:42

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

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

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

Результат:

0b11100001
0b1010
0b1110100
0
Jean-François Fabre 10 Янв 2017 в 14:30