逐位运算一元〜(反转)

Alc*_*ott 53 python bit-manipulation

我对~操作员有点困惑.代码如下:

a = 1
~a  #-2
b = 15
~b  #-16
Run Code Online (Sandbox Code Playgroud)

怎么~办?

我想,~a会是这样的:

0001 = a
1110 = ~a 
Run Code Online (Sandbox Code Playgroud)

为什么不?

Nul*_*ion 53

你是完全正确的.它是二进制补码整数表示的工件.

在16位中,1表示为0000 0000 0000 0001.倒置,你得到1111 1111 1111 1110,这是-2.同样,15是0000 0000 0000 1111.倒置,你得到1111 1111 1111 0000,这是-16.

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

  • 如何在python 3中获得该位表示字符串? (5认同)
  • 这是Janus想要的相反功能. (3认同)

seb*_*ebs 29

'〜'运算符定义为:"x的逐位反转定义为 - (x + 1).它仅适用于整数." Python Doc - 5.5

这句话的重要部分是这与"整数"(也称为整数)有关.您的示例代表一个4位数字.

'0001' = 1 
Run Code Online (Sandbox Code Playgroud)

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

由于Python对整数进行操作,因此您所描述的行为是预期的.整数用二进制表示.如果是4位数,则如下所示.

 7 = '0111'
 0 = '0000'
-1 = '1111'
-8 = '1000'
Run Code Online (Sandbox Code Playgroud)

如果您有32位操作系统,Python使用32位进行整数表示.你可以检查最大的整数:

sys.maxint # (2^31)-1 for my system
Run Code Online (Sandbox Code Playgroud)

如果您希望为您返回4位数的无符号整数,则必须进行掩码.

'0001' = a   # unsigned '1' / integer '1'
'1110' = ~a  # unsigned '14' / integer -2

(~a & 0xF) # returns 14
Run Code Online (Sandbox Code Playgroud)

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

(~a & 0xFF) # returns 254
Run Code Online (Sandbox Code Playgroud)

  • 整数在python 2和3中都具有无限精度 (5认同)

use*_*134 6

您还可以使用无符号整数(例如来自 numpy 包)来实现预期的行为。

>>> import numpy as np
>>> bin( ~ np.uint8(1))
'0b11111110'
Run Code Online (Sandbox Code Playgroud)


小智 6

看起来我找到了更简单的解决方案,可以满足需要:

uint8: x ^ 0xFF
uint16: x ^ 0xFFFF
uint32: x ^ 0xFFFFFFFF
uint64: x ^ 0xFFFFFFFFFFFFFFFF
Run Code Online (Sandbox Code Playgroud)