2008-10-16 12 views
27

किसी अन्य पोस्ट का जवाब देने का प्रयास कर रहा है जिसका समाधान आईपी पते और नेटमास्क के साथ सौदा करता है, मैं सादा bitwise अंकगणित के साथ अटक गया।पायथन: 32 बिट बिटवाइथ अंकगणित

क्या पाइथन में थोड़ा सा तरीका है, थोड़ा सा और, या, एक्सओआर, ऑपरेशन मानते हैं कि इनपुट "32 बिट" (शायद नकारात्मक) पूर्णांक या लंबे समय तक हैं, और परिणाम एक लंबा होना चाहिए सीमा में [0, 2 ** 32]?

दूसरे शब्दों में, मुझे बिना हस्ताक्षर किए गए लम्बाई के बीच सी बिटवाई ऑपरेशंस के लिए एक पाइथन समकक्ष की आवश्यकता है।

संपादित करें: विशिष्ट मुद्दा यह है:

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

मुझे लगता है कि पाइथन ढीले टाइपिंग इस तरह के किसी भी एल्गोरिदम के साथ नरक खेलेंगे ... मैं उत्सुकता से बाहर भी एक देखना चाहता हूं। –

+0

पायथन 3.3 के रूप में, कुछ उपयोगकर्ताओं को इसका सामना करना पड़ सकता है [ipaddress मॉड्यूल] (http://docs.python.org/dev/library/ipaddress) में रुचि हो सकती है। – gerrit

उत्तर

36

आप 0xFFFFFFFF से सब कुछ मुखौटा कर सकते हैं:

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

यह रणनीति [बैश अंकगणित] (http://stackoverflow.com/questions/3222379/how-to- कुशलतापूर्वक-convert-long-int-to-dotted-quad-ip-in-bash) के साथ भी मदद करता है। – bstpierre

+1

आप आवश्यकतानुसार एक और ऑपरेशन कर रहे हैं। एक नॉटिंग एक एक्सओआर के समान है। तो, 'एम^allf' है जो आपको चाहिए। – HardlyKnowEm

+0

@mlefavor मुझे नहीं पता कि आपको यह विचार कहां मिला कि 'a & b'' a^b' जैसा ही है। यह सामान्य रूप से नहीं है। –

9
from numpy import uint32 
+0

पोर्टेबल नहीं है, लेकिन यह काम करता है। +1 –

+2

पोर्टेबल क्यों नहीं? – gerrit

+0

@gerrit क्या वह इस तथ्य का जिक्र कर रहा है कि इसे सिस्टम को numpy मॉड्यूल स्थापित करने की आवश्यकता है जबकि ctypes कोर पायथन का हिस्सा है? – penguin359

49

आप ctypes और उसके c_uint32 उपयोग कर सकते हैं:

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

मैं यहाँ तो क्या किया एक सी के लिए कास्टिंग था 32- थोड़ा हस्ताक्षरित पूर्णांक और पायथन प्रारूप में इसके मूल्य को वापस प्राप्त करना।

+1

पोर्टेबल, और यह काम करता है। +1 –

1

यह एक मॉड्यूल है कि मैं एक लंबे समय पहले बनाया है, और यह आप के लिए सहायक हो सकता है:

IPv4Utils

यह प्रदान करता है सबनेट अंकगणितीय के साथ कम से कम CIDR कक्षा। उदाहरण के लिए मॉड्यूल के अंत में परीक्षण के मामलों की जांच करें।

0

आप 0xFFFFFFFF के साथ भी xor कर सकते हैं, जो "हस्ताक्षरित पूरक" के बराबर है।

>>> 0xFFFFFF00^0xFFFFFFFF 
255 
संबंधित मुद्दे