Ответ 1
Вы можете замаскировать все на 0xFFFFFFFF
:
>>> m = 0xFFFFFF00
>>> allf = 0xFFFFFFFF
>>> ~m & allf
255L
Пытаясь ответить на другой пост, решение которого касается 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
Вы можете замаскировать все на 0xFFFFFFFF
:
>>> m = 0xFFFFFF00
>>> allf = 0xFFFFFFFF
>>> ~m & allf
255L
Вы можете использовать ctypes и его c_uint32
:
>>> import ctypes
>>> m = 0xFFFFFF00
>>> ctypes.c_uint32(~m).value
255L
Итак, что я сделал здесь, было отличное ~m
для 32-битного беззнакового целого C и получение его значения в формате Python.
from numpy import uint32
Это модуль, который я создал давно, и он может вам помочь:
Он предоставляет по меньшей мере класс CIDR
с арифметикой подсети. Для примера проверьте тестовые примеры в конце модуля.
Вы также можете xor с 0xFFFFFFFF, что эквивалентно "неподписанному дополнению".
>>> 0xFFFFFF00 ^ 0xFFFFFFFF
255