按位运算符:- Ball、carrot、& 符号、波浪号

Bitwise operators:- Ball, carrot, ampersand, tilde

提问人: 提问时间:10/27/2022 最后编辑:alex 更新时间:10/28/2022 访问量:184

问:

我想要以下代码的分步说明

print(1 | 0 ^ 1 & ~0)

我尝试使用输出位(第一位和第二位的输出)并得到答案为 0。波浪号功能让我迷上了一段时间,我发现它有点难。答案是1

python 按位运算符 & 波浪号

评论

0赞 Codist 10/27/2022
确保您了解此处描述的各种运算符的优先级:- docs.python.org/3/library/operator.html
0赞 James Newman 10/28/2022
如果您选择一个答案,我将不胜感激,因为我和另一位贡献者已经充分回答了这个问题。

答:

2赞 James Newman 10/27/2022 #1

首先,您必须了解每个运算符的作用

|- 按位 OR:如果任一操作数为 1,则返回 ()。例如True1

1 | 0 == True

&- 按位 AND:如果其两个操作数均为 1,则返回。例如True

0 & 1 == False

^- 按位异或:如果只有一个操作数为 1,则返回。例如True

0 ^ 1 == True

~- Bitwise NOT:翻转其操作数的位。

编辑:正如丹尼尔·马丁(Daniel Martin)所指出的,特别是在Python中,它翻转了任意整数的所有位。公式如下~x == -x - 1

~0 == -1

然后,您必须了解按位运算的顺序

按优先顺序:

~ -> & -> ^ -> |

按该顺序求解表达式

  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 - |最后应用

评论

0赞 Daniel Martin 10/27/2022
除了在 python 中,因为它翻转了“所有”位,无论这对任意大小的整数意味着什么。~0-1
0赞 10/27/2022
@James Newman 感谢您的解释。我还有一个疑问,那么按位运算符绑定是从右到左吗?
0赞 Daniel Martin 10/27/2022
@JayantAgarwal python 表达式中运算顺序的官方文档是 docs.python.org/3/reference/expressions.html ,但在按位运算符中是:first , then and (从左到右), 然后是 , 然后是 , 然后是 。~<<>>&^|
0赞 James Newman 10/28/2022
@JayantAgarwal 它不会从右到左读取。这就像常规数学一样,某些运算符的优先级高于其他运算符。 例如,由于运算符的优先级高于 。你实际上是从右边开始的,但这只是因为最右边的语句具有更高的优先级,并且恰好在右边。2 + 3 * 22 + (3 * 2)*+3 * 2
1赞 Daniel Martin 10/27/2022 #2

好的,首先让我们在该代码中放置一些括号,以显示操作顺序如何在 python 中应用:

print(1 | 0 ^ 1 & ~0)

成为

print(1 | (0 ^ (1 & (~0))))

好的,一切都很好。

现在,首先我们将介绍什么方法,然后我们将考虑什么是,然后是 ,然后是 .~01 & (~0)0 ^ (1 & (~0))1 | (0 ^ (1 & (~0)))

因为这些都是按位运算,所以我将在没有警告的情况下在十进制和二进制之间来回切换。我希望你已经对二进制文件有一个基本的介绍。

所以,首先.在具有特定宽度的整数类型的语言中,(例如在 C 或 C++ 中)将意味着“二进制中是所有位的值,与类型一样宽”,因为表示“翻转所有位”并用所有位表示。但是由于 python 的整数没有特定的宽度,这意味着“二进制中的值是无限位序列”,因此我们必须回退到文档中所说的:~0~01~001

一元(反转)运算符生成其整数参数的按位反转。的按位反演定义为 。它仅适用于整数或覆盖特殊方法的自定义对象。~x-(x+1)__invert__()

所以是.~0-1

现在,是什么?好吧,在二进制中只是 ,并且是所有位,随心所欲。因此,这两个值的按位值只是 ,因为对于按位,输出仅在两个输入都有位的地方才有位。1 & (-1)11-11&1&11

现在。好吧,我们知道二进制是什么样子的,我们知道二进制是什么样子的(它们看起来就像十进制一样),并且输出仅在输出和输入不同的地方有位。所以只是.0 ^ (1)01^10 ^ 11

现在。这只是 ,根据 的定义。1 | (1)1|

在某种程度上,python 的整数没有固定的大小,因此比 C 或许多其他语言更难推理,因此在处理时,您必须简要地想象您正在处理的有无限的 s 字符串,但它并没有那么糟糕。~01