在Python控制台中:
~True
给我:
-2
为什么?有人能用二进制解释一下这个特殊案例吗?
~True
给我:
-2
为什么?有人能用二进制解释一下这个特殊案例吗?
int(True)
是 1
。
1
是:
00000001
而 ~1
是:
11111110
在二进制补码1中,-2
的表示为:
1先将所有位取反,然后将结果加1,并把结果解释为数字的二进制表示,最后加上负号(因为数字以1开头)。
11111110 → 00000001 → 00000010
↑ ↑
Flip Add 1
这是2,但符号为负,因为MSB为1。
值得一提的是:
考虑一下bool
,你会发现它在本质上是数值类型 - 它只有两个值,True
和False
,它们只是定制化版本的整数1和0,只是以不同的方式输出。它们是整数类型int
的子类。
所以它们的行为与1和0完全相同,只是bool
重新定义了str
和repr
以便以不同的方式显示它们。
>>> type(True)
<class 'bool'>
>>> isinstance(True, int)
True
>>> True == 1
True
>>> True is 1 # they're still different objects
False
int('1')
д№ҹжҳҜ 1
пјҢдҪҶ ~'1'
еҚҙдјҡдә§з”ҹзұ»еһӢй”ҷиҜҜејӮеёёпјҢиҖҢ ~True
еҲҷдёҚдјҡпјҢиҝҷжҳҜеӣ дёә bool
жҳҜ int
зҡ„еӯҗзұ»гҖӮ@Martijn еңЁд»–зҡ„зӯ”жЎҲдёӯж·»еҠ дәҶиҝҷдёӘдҝЎжҒҜгҖӮ - Grijesh ChauhanTrue == -1
,但我知道有很多语言中可以说 True == 1
... - l4mpi-1
表示TRUE;它有一个不错的特性,即按位AND和OR运算符同样适用于逻辑AND和OR(在C语言中,只要你不关心短路,x & -1
是非零的,在相同情况下x && 1
也是非零的)。然而,据我所知,没有主流语言曾经使用过-1
来表示TRUE。 - QuuxplusonePython中的bool
类型是int
的子类(由于历史原因;布尔值仅在Python 2.3中添加)。
由于int(True)
等于1
,所以~True
等于~1
,即-2
。
请参阅PEP 285了解为什么bool
是int
的子类。
如果你想要布尔值的逆运算,请使用not
:
>>> not True
False
>>> not False
True
如果您想知道为什么~1
是-2
,那是因为您正在反转有符号整数中的所有位;00000001
变成11111110
,在一个有符号整数中是一个负数,请参见二进制补码。>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'
初始的1
位表示该值为负数,其余的位编码为正数减一的倒数。
struct.pack
,因为bin(integer)
或format(integer,'08b')
不考虑有符号整数。 - Martijn Pietersbin(~True)
,bin(-2)
,bin(~1)
都会得到 '-0b10'
。如果 -2
的表示是 10
,那么为什么要加上 -
符号呢? - Grijesh Chauhan10
本身转换为二进制补码,那么它就是负数了吗? - Grijesh Chauhanformat(-2 % (1 << 32), "032b")
。 - thefourtheyeformat(-2 & ((1 << 32) - 1), "032b")
。 - Martijn Pieters~True == -2
的结果并不奇怪,如果 True
表示 1
,~
表示按位取反的话...前提是:
True
可以被视为一个整数;修改如下:
~
不意味着 "2的补码"。~
意味着 "按位取反"。 - McKay
~1
的结果是-2
,所以可以尝试运行True == 1
。 - Grijesh ChauhanTrue == 1
是正确的。 - BachUNARY_INVERT
(整个字节码)会对答案有所帮助吗? - Wooblebool
的一个具体行为,而不是关于~
如何工作的问题。事实上,对这个问题的一个有效回答可以避免提到二进制补码以及~
如何操作整数。 - Bakuriu