波浪线对布尔值的影响——为啥在 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 的位被反转。 + 反转为 -。 两位二进制中的101,所以反转位: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? @zabop 0010 is 2. 1110minus 2,如果您只有四个位并且您正在使用 @987654321 @. 在二进制补码中反转符号涉及:“翻转位并加 1”。如果设置了第一位,则该数字为负数,否则为正数。现在让我用 1110 试试这个。第一位被设置(在这种情况下,第一位是最左边的位),因此它是负数。然后正数是(翻转位并加一)0001 + 1 = 0010(十进制表示= 2)

以上是关于波浪线对布尔值的影响——为啥在 Python 中 ~True 是 -2 而 ~False 是 -1? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥用PyCharm编辑Python代码的时候,代码没有错,为啥代码下面还是有波浪线呢?

如何在 Python 中获得布尔值的相反(否定)?

计算 Python 列表中真正布尔值的数量

python-布尔值的加法运算

始终返回相同布尔值的 Python 函数

JAVA编程时,代码下面的黄颜色波浪线是警告的意思,这对整个程序有影响吗?