Странное поведение оператора Python.исключающее или


Я работаю над головоломкой шифрования и мне нужно взять исключительное или из двух двоичных чисел (я использую пакет operator в Python). Если я запускаю operator.xor(1001111, 1100001), Например, я получаю очень странный вывод 2068086. Почему он не возвращается 0101110 или, по крайней мере, 101110?

3 4

3 ответа:

Потому что Python не рассматривает это как двоичные числа. Вместо этого используйте:

operator.xor(0b1001111, 0b1100001)

Вычисленный ответ использует предоставленные вами десятичные значения, а не их двоичный вид. То, о чем вы действительно просите...

1001111 ^ 1100001

Когда вы имеете в виду-это 79 ^ 97. Вместо этого попробуйте использовать двоичные литералы как таковые...

0b1001111 ^ 0b1100001

Смотрите Как вы выражаете двоичные литералы в Python? для получения дополнительной информации.

Потому что 1001111 и 1100001 не являются двоичными числами. 1001111 - это миллион, тысяча, сто одиннадцать, в то время как 1100001 - это миллион, сто тысяч и один. Python не распознает их как двоичные числа. Двоичные числа должны иметь префикс 0b, чтобы быть распознаны как двоичные числа в Python/Python 3. Итак, правильный путь таков:

operator.xor(0b1001111, 0b1100001)

Но эй! На выходе получаем 46. Мы должны это исправить. К счастью, есть встроенный в Python / Python 3. Это функция bin(n). Эта функция выводит двоичное число с префиксом 0b. Таким образом, наш окончательный код будет следующим:

bin(operator.xor(0b1001111, 0b1100001))

Если мы хотим скрыть 0b (в основном в тех случаях, когда это число выводится на экран), мы должны использовать [2:] следующим образом:

bin(operator.xor(0b1001111, 0b1100001))[2:]

Более короткий путь (предупреждение выглядит как учебник для чего-то, что вы *должны * уже знать)
Ну, operator.xor() слишком большой для оператора:)
Если это так (99,9%), вместо этого вы должны использовать a^b. Я думаю, ты уже знаешь. но почему для того чтобы импортировать весь модуль только для оператора XOR? Если вы хотите ввести слово xor вместо этого, импортируйте модуль operator следующим образом: from operator import a, b.... Затем используйте примерно следующее: bin(xor(a,b)). Я надеюсь, что вы уже знаете, что вещи, но я хочу убедиться, что вы любите кодирование еще больше :)