python - क्या पाइथन में बिटफील्ड प्रकार है?




bit-fields bitarray (6)

मुझे बूलियन की एक सरणी का एक कॉम्पैक्ट प्रतिनिधित्व की आवश्यकता है, क्या पाइथन में एक बिल्टिन बिटफील्ड प्रकार है या क्या मुझे वैकल्पिक समाधान खोजने की आवश्यकता होगी?


NumPy में एक सरणी इंटरफ़ेस मॉड्यूल है जिसका उपयोग आप बिटफील्ड बनाने के लिए कर सकते हैं।


अपने प्रत्येक मूल्य को दो की शक्ति के रूप में प्रस्तुत करें:

testA = 2**0
testB = 2**1
testC = 2**3

फिर एक मान सही सेट करने के लिए:

table = table | testB

एक मूल्य गलत सेट करने के लिए:

table = table & (~testC)

मूल्य के लिए परीक्षण करने के लिए:

bitfield_length = 0xff
if ((table & testB & bitfield_length) != 0):
    print "Field B set"

यदि यह आपको समझ में नहीं आता है तो हेक्साडेसिमल प्रतिनिधित्व में थोड़ी गहरी खुदाई करें। यह मूल रूप से एक एम्बेडेड सी अनुप्रयोग में आपके बूलियन झंडे का ट्रैक कैसे रखता है (यदि आपके पास स्मृति सीमित है)।


जब मैंने हाल ही में इसी तरह की ज़रूरत थी, तो Bitarray मुझे सबसे अच्छा जवाब मिला। यह एक सी एक्सटेंशन है (बिटवक्टर से बहुत तेज है, जो शुद्ध पायथन है) और अपने डेटा को एक वास्तविक बिटफील्ड में संग्रहीत करता है (इसलिए यह एक numpy बूलियन सरणी से आठ गुना अधिक मेमोरी कुशल है, जो प्रति तत्व बाइट का उपयोग करने के लिए प्रतीत होता है।)


बिटवॉक्टर पैकेज आपको जो चाहिए वह हो सकता है। यह मेरी पायथन स्थापना में नहीं बनाया गया है, लेकिन पाइथन साइट पर ट्रैक करना आसान है।

वर्तमान संस्करण के लिए https://pypi.python.org/pypi/BitVector


यदि आप बूल के सरणी (या पूर्णांक के सेट के रूप में) के रूप में प्रतिनिधित्व करने के लिए इनट्स (या लंबे इंट्स) का उपयोग करना चाहते हैं, तो http://sourceforge.net/projects/pybitop/files/ पर एक नज़र डालें

यह लंबे समय तक बिटफील्ड के डालने / निकालने प्रदान करता है; सबसे महत्वपूर्ण, या कम से कम महत्वपूर्ण '1' बिट खोजना; सभी 1 की गिनती; बिट उलट; ऐसी चीजें जो शुद्ध पायथन में संभव है लेकिन सी में बहुत तेज है।


यदि आप मुख्य रूप से अपने बिट फ़ील्ड का नाम देने में सक्षम होना चाहते हैं और आसानी से उन्हें कुशल बनाना चाहते हैं, उदाहरण के लिए संचार प्रोटोकॉल में एकल बिट्स के रूप में प्रतिनिधित्व किए गए झंडे के साथ काम करने के लिए, तो आप मानक संरचना और ctypes विशेषताओं का उपयोग कर सकते हैं जैसा कि मैं कैसे करता हूं उचित रूप से पाइथन में एक प्रकार का निर्माण + संघ घोषित करें? - स्टैक ओवरफ़्लो

उदाहरण के लिए, अलग-अलग बाइट के 4 कम-से-कम महत्वपूर्ण बिट्स के साथ काम करने के लिए, उन्हें केवल LittleEndianStructure में कम से कम सबसे महत्वपूर्ण नाम दें। आप बाइट या int के समान डेटा तक पहुंच प्रदान करने के लिए एक संघ का उपयोग करते हैं ताकि आप डेटा को संचार प्रोटोकॉल में या बाहर ले जा सकें। इस मामले में flags.asbyte फ़ील्ड के माध्यम से किया जाता है:

import ctypes
c_uint8 = ctypes.c_uint8

class Flags_bits(ctypes.LittleEndianStructure):
    _fields_ = [
            ("logout", c_uint8, 1),
            ("userswitch", c_uint8, 1),
            ("suspend", c_uint8, 1),
            ("idle", c_uint8, 1),
        ]

class Flags(ctypes.Union):
    _fields_ = [("b", Flags_bits),
                ("asbyte", c_uint8)]

flags = Flags()
flags.asbyte = 0xc

print(flags.b.idle)
print(flags.b.suspend)
print(flags.b.userswitch)
print(flags.b.logout)

चार बिट्स (जो मैंने यहां सबसे महत्वपूर्ण से शुरू किया है, जो मुद्रण करते समय अधिक प्राकृतिक लगते हैं) बाइनरी में 1, 1, 0, 0, यानी 0xc हैं।







bitarray