波浪线对布尔值的影响——为啥在 Python 中 ~True 是 -2 而 ~False 是 -1? [复制]
Posted
技术标签:
【中文标题】波浪线对布尔值的影响——为啥在 Python 中 ~True 是 -2 而 ~False 是 -1? [复制]【英文标题】:Effect of tilde on booleans — why ~True is -2 & ~False is -1 in Python? [duplicate]波浪线对布尔值的影响——为什么在 Python 中 ~True 是 -2 而 ~False 是 -1? [复制] 【发布时间】:2020-12-08 14:05:27 【问题描述】:问题
我使用 Jupyter Notebook 发现 ~True
是 -2
和 ~False
是 -1
。
This source 表示~
反转所有位。为什么~True
不是False
而~False
不是True
?
推理尝试
我试图解释这些:
True
是+1
,+1
的位被反转。 +
反转为 -
。
两位二进制中的1
是01
,所以反转位:10
,即2
。所以结果是-2
。
False
是+0
,+
反转为-
,0
两位二进制是00
,所有位反转,11
,即3
- 它应该是1
。
来源
This answer 点了一张更复杂的图:
一个完整的 Trues 列表只包含 4 或 8 字节的引用 规范的 True 对象。
This source 说:
bool:布尔(真/假)类型。支持的精度:8(默认) 位。
这些不支持上述简单化(显然是错误的)推理。
问题
那么~True
是-2
和~False
是-1
的正确解释是什么?
【问题讨论】:
你看the canonical reference了吗? "x
的位反转定义为-(x+1)
。"
~1 是-2,~0 是-1,使用二进制补码有符号整数。
好的,谢谢,这很有帮助;我没有。
好的,谢谢!注意到。
【参考方案1】:
首先,我会使用 not 运算符来反转布尔值(不是 True == False,反之亦然)。现在,如果布尔值存储为 8 位整数,则会发生以下情况:
True 是 0000 0001。因此 ~True 产生 1111 1110,在二进制补码表示中是 -2。
False 是 0000 0000。因此 ~False 产生 1111 1111,即 -1。
【讨论】:
你能补充一些关于为什么 1111 1110 是 -2 的细节吗?据我了解 1110 是 2,但为什么呢?为什么 0010 不是 2? @zabop0010
is 2. 1110
是 minus 2,如果您只有四个位并且您正在使用 @987654321 @.
在二进制补码中反转符号涉及:“翻转位并加 1”。如果设置了第一位,则该数字为负数,否则为正数。现在让我用 1110 试试这个。第一位被设置(在这种情况下,第一位是最左边的位),因此它是负数。然后正数是(翻转位并加一)0001 + 1 = 0010(十进制表示= 2)以上是关于波浪线对布尔值的影响——为啥在 Python 中 ~True 是 -2 而 ~False 是 -1? [复制]的主要内容,如果未能解决你的问题,请参考以下文章