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