我正在解决一个加密难题,需要对两个二进制数进行异或操作(我在Python中使用operator
包)。例如,如果我运行operator.xor(1001111, 1100001)
,我会得到非常奇怪的输出2068086
。为什么它不返回0101110
或至少101110
呢?
我正在解决一个加密难题,需要对两个二进制数进行异或操作(我在Python中使用operator
包)。例如,如果我运行operator.xor(1001111, 1100001)
,我会得到非常奇怪的输出2068086
。为什么它不返回0101110
或至少101110
呢?
因为Python不将其视为二进制数。因此,请改用:
operator.xor(0b1001111, 0b1100001)
1001111 ^ 1100001
79 ^ 97
时,建议使用二进制字面量来代替...0b1001111 ^ 0b1100001
请查看如何在Python中表示二进制字面量?获取更多信息。
1001111
和 1100001
不是二进制数。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))
。我希望你已经知道这些东西,但我想确保你更享受编码的乐趣 :)