提问人: 提问时间:10/27/2022 最后编辑:alex 更新时间:10/28/2022 访问量:184
按位运算符:- Ball、carrot、& 符号、波浪号
Bitwise operators:- Ball, carrot, ampersand, tilde
问:
我想要以下代码的分步说明:
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
~
- Bitwise NOT:翻转其操作数的位。
编辑:正如丹尼尔·马丁(Daniel Martin)所指出的,特别是在Python中,它翻转了任意整数的所有位。公式如下~x == -x - 1
~0 == -1
然后,您必须了解按位运算的顺序
按优先顺序:
~
-> &
-> ^
-> |
按该顺序求解表达式
1 | 0 ^ 1 & ~0 == 1 | 0 ^ 1 & -1
-~
首先应用1 | 0 ^ 1 & -1 == 1 | 0 ^ 1
-&
其次是应用1 | 0 ^ 1 == 1 | 1
-^
第三应用1 | 1 == 1
-|
最后应用
评论
~0
-1
~
<<
>>
&
^
|
2 + 3 * 2
2 + (3 * 2)
*
+
3 * 2
好的,首先让我们在该代码中放置一些括号,以显示操作顺序如何在 python 中应用:
print(1 | 0 ^ 1 & ~0)
成为
print(1 | (0 ^ (1 & (~0))))
好的,一切都很好。
现在,首先我们将介绍什么方法,然后我们将考虑什么是,然后是 ,然后是 .~0
1 & (~0)
0 ^ (1 & (~0))
1 | (0 ^ (1 & (~0)))
因为这些都是按位运算,所以我将在没有警告的情况下在十进制和二进制之间来回切换。我希望你已经对二进制文件有一个基本的介绍。
所以,首先.在具有特定宽度的整数类型的语言中,(例如在 C 或 C++ 中)将意味着“二进制中是所有位的值,与类型一样宽”,因为表示“翻转所有位”并用所有位表示。但是由于 python 的整数没有特定的宽度,这意味着“二进制中的值是无限位序列”,因此我们必须回退到文档中所说的:~0
~0
1
~
0
0
1
一元(反转)运算符生成其整数参数的按位反转。的按位反演定义为 。它仅适用于整数或覆盖特殊方法的自定义对象。
~
x
-(x+1)
__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 或许多其他语言更难推理,因此在处理时,您必须简要地想象您正在处理的有无限的 s 字符串,但它并没有那么糟糕。~0
1
评论