Подтвердить что ты не робот

Python: неподписанная 32-битная побитовая арифметика

Пытаясь ответить на другой пост, решение которого касается IP-адресов и сетевых масок, я застрял в простой поразрядной арифметике.

Существует ли стандартный способ в Python выполнять побитовые операции AND, OR, XOR, NOT, предполагая, что входы представляют собой "32-битные" (возможно, отрицательные) целые числа или longs и что результат должен быть длинным диапазон [0, 2 ** 32]?

Другими словами, мне нужен рабочий Python-аналог побитовых операций C между unsigned longs.

EDIT: конкретная проблема заключается в следующем:

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

Ответ 1

Вы можете замаскировать все на 0xFFFFFFFF:

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

Ответ 2

Вы можете использовать ctypes и его c_uint32:

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

Итак, что я сделал здесь, было отличное ~m для 32-битного беззнакового целого C и получение его значения в формате Python.

Ответ 3

from numpy import uint32

Ответ 4

Это модуль, который я создал давно, и он может вам помочь:

IPv4Utils

Он предоставляет по меньшей мере класс CIDR с арифметикой подсети. Для примера проверьте тестовые примеры в конце модуля.

Ответ 5

Вы также можете xor с 0xFFFFFFFF, что эквивалентно "неподписанному дополнению".

>>> 0xFFFFFF00 ^ 0xFFFFFFFF
255