在Python中按位的意思

use*_*004 4 python bit-manipulation

为什么按位不能切换到切换位的预期效果?参见下面的例子:

a = 5
print(bin(a))
b = ~a
print(bin(b))
Run Code Online (Sandbox Code Playgroud)

这是输出:

0b101
-0b110
Run Code Online (Sandbox Code Playgroud)

问题是为什么左边的第一个位没有切换?

考虑到Python文档说:

~x返回x的补码 - 通过将每个1切换为0而每个0切换为1得到的数字.


编辑:您是说"〜"不是简单切换位的运算符,而是它是二进制补码的运算符?如果是这样,为什么从文档中引用的句子不能说明这一点.Python文档中的上述句子并不意味着这一点.

use*_*ica 13

正在切换所有位.所有这些,包括无限数量的前导零,产生无限数量的前导零:

0b...111111111111111111111111111111111111111111111111111010
Run Code Online (Sandbox Code Playgroud)

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

Python无法向您显示无限数量的前导,因此它会在前面显示bin(abs(b))一个-符号.abs(b)是的6,bin(6)是的'0b110',所以你看

-0b110
Run Code Online (Sandbox Code Playgroud)