2009-04-05 10 views
7

मैं संपीड़न के लिए हफमैन एल्गोरिदम लागू करने की कोशिश कर रहा हूं, जिसके लिए एक फ़ाइल में परिवर्तनीय लंबाई की बिट्स लिखना आवश्यक है। क्या फ़ाइल में 1-बिट ग्रैन्युलरिटी के साथ परिवर्तनीय लंबाई डेटा लिखने के लिए सी ++ में कोई तरीका है?हफमैन एन्कोडिंग

उत्तर

9

नहीं, फ़ाइल में जो डेटा आप लिख सकते हैं, उसमें सबसे छोटी मात्रा एक बाइट है।

आप फ़ाइल को लिखने के लिए ofstream का उपयोग करने के लिए bitset का उपयोग कर सकते हैं। यदि आप बिटसेट का उपयोग नहीं करना चाहते हैं, तो आप इसे सहेजने से पहले अपने डेटा में हेरफेर करने के लिए bitwise operators का उपयोग कर सकते हैं।

3

बिट्स की सबसे छोटी राशि जो आप एक्सेस और सहेज सकते हैं 8 = 1 बाइट है। आप बिट ऑपरेटर^& का उपयोग करके बाइट में बिट्स तक पहुंच सकते हैं।

आप का उपयोग करने के लिए 1 n'th बिट सेट कर सकते हैं:

my_byte = my_byte & ((~1) << n); 
:

my_byte = my_byte | (1 << n); 

जहां n है 0 7. को

आप का उपयोग करने के लिए 0 n'th बिट सेट कर सकते हैं

आप का उपयोग करके थोड़ा सा टॉगल कर सकते हैं:

my_byte = my_byte^(1 << n); 

अधिक जानकारी here

2

क्लेव का जवाब शायद आप चाहते हैं, लेकिन बिल के बारे में कुछ जोड़ने के लिए, बूस्ट पुस्तकालयों में dynamic_bitset है जो मुझे एक समान स्थिति में सहायक पाया।

1

नहीं। आपको बाइट्स पैक करना होगा। तदनुसार, आपको अपनी फ़ाइल में एक शीर्षलेख की आवश्यकता होगी जो निर्दिष्ट करता है कि आपकी फ़ाइल में कितने तत्व हैं, क्योंकि आपके पास पीछे की पिछली बिट्स होने की संभावना है।

+0

आपको फ़ाइल के तत्वों की संख्या की गणना करने की आवश्यकता नहीं है, एक विशेष विशेष चरित्र बिल फिट कर सकता है –

2

सभी जानकारी आप बिट twiddling पर की जरूरत है यहाँ है:
How do you set, clear, and toggle a single bit?

लेकिन छोटी से छोटी वस्तु है कि आप एक फाइल में डाल सकते हैं एक बाइट है।
मैं गतिशील_बिसेटसेट का उपयोग करता हूं और हर बार आकार 8 से बड़ा हो जाता है, नीचे 8 बिट्स को चार में निकाला जाता है और इसे फ़ाइल में लिखता है, फिर शेष बिट्स को 8 स्थानों (दोहराएं) में स्थानांतरित करें।

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