我想要以下代码的逐步解释:
print(1 | 0 ^ 1 & ~0)
我尝试了输出位(第一位和第二位的输出(,得到的答案是0。波浪号函数让我有一段时间没用,我觉得它有点难答案是1。
首先,您必须了解每个运算符的作用
|
—逐位OR:如果其中一个操作数为1,则返回True
(1
(。例如
1 | 0 == True
&
—逐位AND:如果两个操作数都为1,则返回True
。例如
0 & 1 == False
^
—逐位异或:如果只有一个操作数为1,则返回True
。例如
0 ^ 1 == True
~
—逐位NOT:翻转其操作数的位。
edit:正如Daniel Martin所指出的,在Python中,它翻转任意整数的所有位。公式为~x == -x - 1
,例如
~0 == -1
然后您必须了解按位操作的顺序
按优先顺序:
~
->&
->CCD_ 16->|
按该顺序求解表达式
- 首先应用
1 | 0 ^ 1 & ~0 == 1 | 0 ^ 1 & -1
-~
1 | 0 ^ 1 & -1 == 1 | 0 ^ 1
-&
第二次应用1 | 0 ^ 1 == 1 | 1
-^
第三次应用1 | 1 == 1
-|
最后应用
好的,首先让我们在代码中放一些括号,以显示操作顺序如何在python:中应用
print(1 | 0 ^ 1 & ~0)
成为
print(1 | (0 ^ (1 & (~0))))
好的,一切都好。
现在,首先我们将了解~0
的含义,然后我们将考虑1 & (~0)
是什么,然后是0 ^ (1 & (~0))
,然后是1 | (0 ^ (1 & (~0)))
。
因为这些都是按位操作,所以我将在十进制和二进制之间来回切换,而不会发出任何警告。我希望你已经基本介绍了什么是二进制
因此,首先是~0
。在具有特定宽度的整数类型的语言中(例如在C或C++中(~0
将意味着"0";以二进制形式为所有CCD_;,由于CCD_ 33意味着";翻转所有位";并且CCD_ 34用所有比特CCD_。但由于python的整数没有特定的宽度,这意味着";二进制的值是CCD_ 36比特的无限序列";,因此,我们必须依靠文件中的内容:
一元
~
(invert(运算符生成其整数参数的逐位反转。CCD_ 38的逐位反转被定义为CCD_。它只适用于整数或覆盖__invert__()
特殊方法的自定义对象。
所以~0
就是-1
。
现在,什么是1 & (-1)
?在二进制中,1
只是1
,而-1
则是所有1
位,可以任意大小。因此,这两个值中的按位&
仅为1
,因为对于按位&
,仅当两个输入都具有1
位时,输出才具有1
位。
现在,0 ^ (1)
。我们知道0
在二进制中的样子,也知道1
在二进制中是什么样子(它们看起来就像十进制(,而^
的输出只有在输出和输入不同的地方才有1
位。所以0 ^ 1
就是1
。
现在是1 | (1)
。根据|
的定义,这只是1
。
在某种程度上,python的整数没有固定的大小,这使得它比在C或许多其他语言中更难推理,所以在处理~0
时,你必须简单地想象一下,你正在处理的是一个由1
组成的无限字符串,但它并没有那么糟糕。