Python: aritmética sin bit de 32 bits sin signo

Tratando de responder a otra publicación cuya solución tiene que ver con direcciones IP y máscaras de red, me quedé estancado con la aritmética simple a nivel de bits.

¿Existe una forma estándar, en Python, para llevar a cabo las operaciones AND, OR, XOR, NOT a nivel de bits suponiendo que las entradas son enteros o largos de “32 bits” (quizás negativos), y que el resultado debe ser muy largo en el rango [ 0, 2 ** 32]?

En otras palabras, necesito una contraparte de Python que funcione para las operaciones bitwise de C entre largos sin firmar.

EDITAR: el problema específico es este:

>>> m = 0xFFFFFF00 # netmask 255.255.255.0 >>> ~m -4294967041L # wtf?! I want 255 

Puedes enmascarar todo por 0xFFFFFFFF :

 >>> m = 0xFFFFFF00 >>> allf = 0xFFFFFFFF >>> ~m & allf 255L 

Puedes usar ctypes y su c_uint32 :

 >>> import ctypes >>> m = 0xFFFFFF00 >>> ctypes.c_uint32(~m).value 255L 

Entonces, lo que hice aquí fue convertir ~m a un entero sin signo C-32 bits y recuperar su valor nuevamente en formato Python.

 from numpy import uint32 

Este es un módulo que creé hace mucho tiempo y podría ser de ayuda para usted:

IPv4Utils

Proporciona al menos una clase CIDR con aritmética de subred. Verifique los casos de prueba al final del módulo para ver ejemplos.

También podría xor con 0xFFFFFFFF, que es equivalente al “complemento sin firmar”.

 >>> 0xFFFFFF00 ^ 0xFFFFFFFF 255