2017-10-04 21 views
0

为什么按位不是不按预期切换位?见下面的例子:Bit-wise NOT在Python中的含义

a = 5 
print(bin(a)) 
b = ~a 
print(bin(b)) 

这是输出:

0b101 
-0b110 

的问题是,为什么从左边第一位不反转?

考虑到Python文档说:

〜X返回x的补充 - 您可以通过切换各 1 0获得数量和每个0为1


编辑:你是说“〜”不是简单切换位的操作符,而是两个补码的操作符? 如果是这样,为什么从文档中引用的句子没有说明。 Pyhton文档中的上述句子并不意味着这对我来说。

+0

这两个互补 –

+0

注意'-'在-0b110'的'前。它无法向您展示一系列无穷大的'1's,它们向左延伸,因此它向您显示'bin(abs(b))',前面带有'-'符号。 – user2357112

+0

序言 - https://wiki.python.org/moin/BitwiseOperators –

回答

4

切换所有的位。 他们的所有,包括前导零的无限数量,产生领头的人的无限数量:

0b...111111111111111111111111111111111111111111111111111010 

因为Python模拟无限位表示,而不是3位或32位或64位或任何有限数量。

Python无法向您显示无限数量的前导字符,因此它会向您显示bin(abs(b))前面带有-的符号。 abs(b)6bin(6)'0b110',让你看到

-0b110 
+0

这是一个非常好的答案。你从哪里得到信息? – lmiguelvargasf

+0

@lmiguelvargasf:很难记住我读过的所有东西,但至少我的一个来源可能是[Python数据模型文档](https://docs.python.org/3/reference/datamodel.html #标准类型层次结构),其中说:“为了移位和掩码操作的目的,假定一个二进制表示,并且负数用2的补码变体表示,这给出了无限串符号位的错觉延伸到左边。“ – user2357112