2014-10-11 7 views
5

मैं हास्केल को कुछ अनिवार्य कोड पोर्ट कर रहा हूं। मेरा लक्ष्य निष्पादन योग्य का विश्लेषण करना है, इसलिए टेक्स्ट सेक्शन के प्रत्येक बाइट को कई झंडे सौंपे जाते हैं, जो सभी बाइट में फिट होंगे (6 बिट सटीक होने के लिए)।बिट झंडे की सरणी के लिए कौन सी डेटा संरचना?

सी जैसी भाषा में, मैं केवल बाइट्स की एक सरणी आवंटित करता हूं, उन्हें शून्य करता हूं और जैसे ही मैं जाता हूं उन्हें अद्यतन करता हूं। हास्केल में मैं इसे कुशलतापूर्वक कैसे करूं?

दूसरे शब्दों में: मैं बिट-वार एक्सेस और निरंतर समय अपडेट के साथ बाइटस्ट्रिंग की तलाश में हूं क्योंकि मैं टेक्स्ट अनुभाग को और अधिक डिस्सेबल करता हूं।

संपादित करें: बेशक, किसी भी प्रकार की अन्य डेटा संरचना ऐसा ही करेगी यदि यह समान रूप से कुशल थी।

उत्तर

6

आप किसी भी डेटा प्रकार के साथ वेक्टर का उपयोग कर सकते हैं जो Bits typeclass का उदाहरण है, उदाहरण के लिए Word64 वेक्टर में प्रति बिट 64 बिट्स के लिए। यदि आप सरणी को स्मृति में संगत करना चाहते हैं तो एक अनबॉक्स किए गए वेक्टर का उपयोग करें।

9

के अनबॉक्स किए गए सरणी के लिए कार्यान्वयन array में पैक किया गया एक बिटरैयर है। आप ST Monad में ऐसे सरणी पर उत्परिवर्तनीय अपडेट कर सकते हैं (यह अनिवार्य रूप से सी में समान रनटाइम व्यवहार है)।

+0

ये दोनों उत्कृष्ट उत्तर हैं, लेकिन मुझे लगता है कि मैं जीएसपीआर के साथ जाता हूं क्योंकि यह मेरे लिए अधिक मूर्खतापूर्ण लगता है। –

+0

@ सेबेस्टियन: 'वेक्टर' बिट्स को बिट्स में पैक नहीं करता है, इसलिए यदि आप विशिष्ट बिट्स को पढ़ना/लिखना चाहते हैं तो आपको अपना खुद का रैपर लिखना होगा। अधिकतर समय 'वेक्टर' अमीर एपीआई की वजह से बेहतर विकल्प है, लेकिन यहां 'सरणी' शायद आसान है। –

+1

मुझे लगता है कि मैं प्रत्येक तत्व के लिए एक बाइट आवंटित करूंगा, क्योंकि मैं * सोचता हूं * जो तत्व पहुंच परिप्रेक्ष्य से अधिक प्रदर्शनकारी होगा। यह भी लगता है कि 'बिट्स' के शीर्ष पर मेरे झंडे को लागू करने की तरह लगातार 6 बूल की तुलना में कहीं अधिक सुविधाजनक है, हालांकि यह व्यक्तिपरक हो सकता है। –

संबंधित मुद्दे