35

ソリューションがIPアドレスとネットマスクを扱っている別の投稿に答えようとして、私は単純なビット単位の演算で行き詰まりました。

Pythonで、入力が「32ビット」(おそらく負の)整数またはlongであり、結果が[[ 0、2 ** 32]?

言い換えると、unsignedlong間のCビット演算に対応するPythonの動作が必要です。

編集:特定の問題はこれです:

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

5 に答える 5

57

ctypesとそのc_uint32:

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

ここで行ったことは~m、C の 32 ビット符号なし整数にキャストし、その値を Python 形式で取得することでした。

于 2008-10-17T00:27:26.710 に答える
47

次の方法ですべてをマスクできます0xFFFFFFFF

>>> m = 0xFFFFFF00
>>> allf = 0xFFFFFFFF
>>> ~m & allf
255L
于 2008-10-17T00:28:43.257 に答える
12
from numpy import uint32
于 2008-10-17T00:04:03.730 に答える
5

「符号なし補数」に相当する 0xFFFFFFFF で xor することもできます。

>>> 0xFFFFFF00 ^ 0xFFFFFFFF
255
于 2016-01-22T16:10:58.523 に答える
1

これは私がずっと前に作成したモジュールであり、あなたの助けになるかもしれません:

IPv4Utils

少なくとも、CIDRサブネット演算を備えたクラスを提供します。例については、モジュールの最後にあるテストケースを確認してください。

于 2008-10-17T07:45:07.650 に答える