Python: 32-битная арифметика без знака - PullRequest
29 голосов
/ 17 октября 2008

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

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

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

РЕДАКТИРОВАТЬ: конкретная проблема заключается в следующем:

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

Ответы [ 5 ]

51 голосов
/ 17 октября 2008

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

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

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

38 голосов
/ 17 октября 2008

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

>>> m = 0xFFFFFF00
>>> allf = 0xFFFFFFFF
>>> ~m & allf
255L
10 голосов
/ 17 октября 2008
from numpy import uint32
1 голос
/ 17 октября 2008

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

IPv4Utils

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

0 голосов
/ 22 января 2016

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

>>> 0xFFFFFF00 ^ 0xFFFFFFFF
255
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...