【问题标题】:Why does ~True result in -2?为什么 ~True 结果是-2?
【发布时间】:2014-03-19 20:02:34
【问题描述】:

在 Python 控制台中:

~True

给我:

-2

为什么?有人可以用二进制向我解释这个特殊情况吗?

【问题讨论】:

  • 因为~1-2,请尝试:True == 1
  • 确切地说:“True is 1”不是真的,True == 1 是真的。
  • 你真的认为看到UNARY_INVERT(整个字节码)会增加答案吗?
  • 这个问题不是重复的!它询问bool 的特定行为。这与~ 的工作方式无关。事实上,对这个问题的有效回答可以避免提及 2 的补码以及 ~ 如何对整数进行操作。

标签: python data-conversion tilde


【解决方案1】:

int(True)1

1 是:

00000001

~1 是:

11111110

Two's complement中的-21

1 翻转所有位,将结果数加 1 并将结果解释为幅度的二进制表示并添加负号(因为数字开始1):

11111110 → 00000001 → 00000010 
         ↑          ↑ 
       Flip       Add 1

这是 2,但符号为负,因为 MSB 是 1。


值得一提:

想想bool,你会发现它本质上是数字——它有两个值,TrueFalse,它们只是整数 1 和 0 的“定制”版本,它们只会打印自己不同。它们是整数类型int子类

所以它们的行为与 1 和 0 完全相同,只是 bool 重新定义了 strrepr 以不同方式显示它们。

>>> type(True)
<class 'bool'>
>>> isinstance(True, int)
True

>>> True == 1
True
>>> True is 1  # they're still different objects
False

【讨论】:

  • @ofcapl 只是想说:虽然int('1') 也是1~'1' 是类型错误异常,而~True 不是这是因为bool 是@987654347 的子类@@Martijn 在他的回答中添加了这个信息。
  • 作为记录,@ofcapl,这个答案显示了正在发生的事情的二进制算术解释,而不是实际的bytecode(这将是某种从源代码编译的中间或操作级代码) .
  • @etrusco 你在说什么语言?我确切地知道True == -1 的位置为0,而且我知道很多地方可以说True == 1...
  • @etrusco @l4mpi 一些老式 BASIC 使用 -1 表示 TRUE;它有一个很好的特性,即按位 AND 和 OR 运算符也适用于逻辑 AND 和 OR(x &amp; -1 在 C 中x &amp;&amp; 1 非零的情况下非零),只要你不这样做'不关心短路。但是,据我所知,没有任何主流语言使用-1 表示 TRUE。
  • 形式逻辑将truth定义为单值;所有这一切都不是truefalse。我所知道的所有编程语言都将形式逻辑置于其头上,将false 定义为单值(0),而所有不是错误的都是true)。例如C#,尽管 Javascript 有点离群,但有多种真实性和multiple flavors of falsiness
【解决方案2】:

Python bool 类型是 int 的子类(出于历史原因;布尔值仅在 Python 2.3 中添加)。

因为int(True)1,所以~True~1-2

请参阅PEP 285,了解为什么boolint 的子类。

如果您想要布尔逆,请使用not

>>> not True
False
>>> not False
True

如果您想知道为什么~1-2,那是因为您将有符号整数中的所有位取反; 00000001 变为 1111110signed 整数中是一个负数,参见 Two's complement:

>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'

其中初始1 位表示该值为负数,其余位编码正数减一的倒数。

【讨论】:

  • @GrijeshChauhan:为了恭维,您可以使用struct.pack,因为bin(integer)format(integer, '08b') 不要考虑有符号整数。
  • @thefourtheye , MartijnPieters 我试过但它令人困惑,例如bin(~True), bin(-2), bin(~1) 都给出'-0b10' 如果-2 表示是10 那么为什么- 符号。
  • 我的意思是10 本身 2'complement then -ve?
  • @GrijeshChauhan 您可以像这样format(-2 % (1 &lt;&lt; 32), "032b") 获得负数和正数的二进制补码表示法
  • @thefourtheye:我会使用位掩码:format(-2 &amp; ((1 &lt;&lt; 32) - 1), "032b")
【解决方案3】:

~True == -2 如果 True 表示1 ~ 表示位反转,这并不奇怪...... p>

...前提是


编辑:

  • 修复了整数表示和按位求逆运算符之间的混合问题
  • 应用了另一次润色(消息越短,需要的工作越多)

【讨论】:

  • ~ 并不意味着“2s 补码”。 ~ 表示“按位反转”
  • “一个补码”这个短语实际上并不是指一种操作,而是指一种以位为单位存储整数的系统。实际未在计算机系统中使用的系统。
猜你喜欢
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 2012-09-20
相关资源
最近更新 更多