位运算一元 ~(取反)

92 投票
6 回答
136118 浏览
提问于 2025-04-17 01:11

我对~这个运算符有点困惑。下面是代码:

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

~到底是怎么工作的呢?

我原以为~a会像这样:

0001 = a
1110 = ~a 

为什么不是呢?

6 个回答

28

看起来我找到了一个更简单的解决方案,可以实现想要的效果:

uint8: x ^ 0xFF
uint16: x ^ 0xFFFF
uint32: x ^ 0xFFFFFFFF
uint64: x ^ 0xFFFFFFFFFFFFFFFF
38

‘~’这个符号的意思是:对一个数字进行按位取反,计算方式是-(x+1)。这个操作只适用于整数。

这里面最重要的是,它跟“整数”有关,也就是我们常说的整数字。你给的例子是一个4位的数字。

'0001' = 1 

4位数字的整数范围是从-8到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
77

你说得完全正确。这是因为使用了二进制补码来表示整数。

在16位的情况下,数字1的表示是0000 0000 0000 0001。如果把它反转,就变成1111 1111 1111 1110,这个值是-2。同样,数字15的表示是0000 0000 0000 1111,反转后变成1111 1111 1111 0000,这个值是-16。

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

撰写回答