按位操作一元〜(反转)

我有点困惑~运算符。 代码如下:

 a = 1 ~a #-2 b = 15 ~b #-16 

~如何工作?

我以为, ~a会是这样的:

 0001 = a 1110 = ~a 

为什么不?

你完全正确。 这是二进制补码整数表示的一个产物。

在16位中,1表示为0000 0000 0000 0001 。 反过来,你得到1111 1111 1111 1110 ,这是-2。 同样,15是0000 0000 0000 1111 。 反过来,你得到1111 1111 1111 0000 ,这是-16。

一般来说, ~n = -n - 1

'〜'运算符定义为:“x的位反转定义为 – (x + 1),它只适用于整数。 Python文档 – 5.5

这句话的重要部分是这与“整数”(也称为整数)有关。 你的例子表示一个4位数字。

 '0001' = 1 

4位数的整数范围是'-8..0..7'。 另一方面,你可以使用'无符号整数',不包括负数,4位数的范围是'0..15'。

由于Python在整数上运行,所以您所描述的行为是预期的。 整数用二进制补码表示。 如果是4位数字,则如下所示。

  7 = '0111' 0 = '0000' -1 = '1111' -8 = '1000' 

如果你有一个32位的操作系统,Python使用32位来表示整型。 你可以检查最大的整数:

 sys.maxint # (2^31)-1 for my system 

如果你想要一个无符号整数返回给你4位数字,你必须掩码。

 '0001' = a # unsigned '1' / integer '1' '1110' = ~a # unsigned '14' / integer -2 (~a & 0xF) # returns 14 

如果你想获得一个无符号的8位数字范围(0..255),而不是使用:

 (~a & 0xFF) # returns 254 

您也可以使用未签名的整数(例如numpy包)来实现预期的行为。

 >>> import numpy as np >>> bin( ~ np.uint8(1)) '0b11111110' 

它看起来像我find更简单的解决scheme,做什么是理想的:

 uint8: x ^ 0xFF<br> uint16: x ^ 0xFFFF<br> uint32: x ^ 0xFFFFFFFF<br> uint64: x ^ 0xFFFFFFFFFFFFFFFF