逐位运算符:-球、胡萝卜、符号和波浪号



我想要以下代码的逐步解释

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. 首先应用1 | 0 ^ 1 & ~0 == 1 | 0 ^ 1 & -1-~
  2. 1 | 0 ^ 1 & -1 == 1 | 0 ^ 1-&第二次应用
  3. 1 | 0 ^ 1 == 1 | 1-^第三次应用
  4. 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组成的无限字符串,但它并没有那么糟糕。

最新更新