ソリューションがIPアドレスとネットマスクを扱っている別の投稿に答えようとして、私は単純なビット演算で行き詰まりました。
Pythonで、入力が「32ビット」(おそらく負の)整数またはlongであり、結果が[[ 0、2 ** 32]?
言い換えると、unsignedlong間のCビット演算に対応する動作するPython)が必要です。
編集:特定の問題はこれです:
>>> 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
をC32ビットの符号なし整数にキャストし、その値をPython形式で取得することでした。
from numpy import uint32
これは私がずっと前に作成したモジュールであり、あなたの助けになるかもしれません:
少なくともCIDR
クラスにサブネット演算を提供します。例については、モジュールの最後にあるテストケースを確認してください。
「符号なし補数」と同等の0xFFFFFFFFでxorすることもできます。
>>> 0xFFFFFF00 ^ 0xFFFFFFFF
255