Python 运算符 operator.xor 的奇怪行为

4

我正在解决一个加密难题,需要对两个二进制数进行异或操作(我在Python中使用operator包)。例如,如果我运行operator.xor(1001111, 1100001),我会得到非常奇怪的输出2068086。为什么它不返回0101110或至少101110呢?


2
为什么不可以呢?1001111不是二进制。 - xfx
我认为应该理解参数应该是二进制数字。 - dsaxton
3个回答

10

因为Python不将其视为二进制数。因此,请改用:

operator.xor(0b1001111, 0b1100001)

7
计算出的答案使用您提供的十进制值,而不是它们的二进制外观。您真正要问的是...
1001111 ^ 1100001

当你要表达的是 79 ^ 97 时,建议使用二进制字面量来代替...
0b1001111 ^ 0b1100001

请查看如何在Python中表示二进制字面量?获取更多信息。


0
因为 10011111100001 不是二进制数。1001111 是一百万、一千、一百十一,而 1100001 是一百一十万零一。Python 不会将它们识别为二进制数。在 Python/Python 3 中,二进制数必须以前缀 0b 开头才能被识别为二进制数。所以正确的方式是这样的:
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,可以像这样导入 operator 模块:from operator import a, b...。然后像这样使用:bin(xor(a,b))。我希望你已经知道这些东西,但我想确保你更享受编码的乐趣 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接