我对~操作符有点迷惑。代码如下:
a = 1
~a #-2
b = 15
~b #-16~是如何工作的?
我想,~a应该是这样的:
0001 = a
1110 = ~a 为什么不行?
发布于 2011-09-02 10:46:31
你说的完全正确。它是two's complement整数表示的产物。
在16位中,1表示为0000 0000 0000 0001。倒置后得到的是1111 1111 1111 1110,它是-2。同样,15是0000 0000 0000 1111。倒置后得到的是1111 1111 1111 0000,它是-16。
一般而言,~n = -n - 1
发布于 2012-10-09 06:41:52
'~‘运算符的定义为:“x的逐位求逆定义为-(x+1)。它仅适用于整数。”Python Doc - 5.5
这句话的重要部分是,这与“整数”(也称为整数)有关。你的例子代表了一个4位的数字。
'0001' = 1 4位数的整数范围是'-8..0..7‘。另一方面,你可以使用‘无符号整数’,不包括负数,你的4位数的范围将是'0..15‘。
因为Python对整数进行操作,所以您所描述的行为是预期的。整数是用二的补码表示的。在4位数字的情况下,这看起来如下所示。
7 = '0111'
0 = '0000'
-1 = '1111'
-8 = '1000'Python使用32位表示整数,如果您使用的是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发布于 2017-10-27 01:57:38
看起来我找到了更简单的解决方案,可以实现所需的功能:
uint8: x ^ 0xFF
uint16: x ^ 0xFFFF
uint32: x ^ 0xFFFFFFFF
uint64: x ^ 0xFFFFFFFFFFFFFFFFhttps://stackoverflow.com/questions/7278779
复制相似问题