मेरे पास vector<char>
है और मैं वेक्टर के भीतर बिट्स की एक श्रृंखला से एक हस्ताक्षरित पूर्णांक प्राप्त करने में सक्षम होना चाहता हूं। जैसेबिट्स से इंटीजर प्राप्त करें 'std :: vector <char> `
और मैं सही संचालन लिखने के लिए वांछित आउटपुट प्राप्त करने के लिए सक्षम होने के लिए नहीं कर पा रहे। मेरे इरादा एल्गोरिथ्म इस प्रकार है:
&
(0xff >> unused bits in byte on the left)
<<
परिणाम के साथ पहली बाइट उत्पादन बाइट की संख्या छोड़ दिया * एक बाइट|
इस अंतिम उत्पादन के साथ में बिट्स की संख्या- प्रत्येक बाद के बाइट के लिए:
<<
बाइट प्रति बाइट 012 द्वारा छोड़ा गया
|
अंतिम आउटपुट>>
साथ अंतिम आउटपुट
|
अंतिम बाइट (स्थानांतरित कर दिया नहीं) के साथ इस बाइट अंतिम सही
#include <vector>
#include <iostream>
#include <cstdint>
#include <bitset>
template<class byte_type = char>
class BitValues {
private:
std::vector<byte_type> bytes;
public:
static const auto bits_per_byte = 8;
BitValues(std::vector<byte_type> bytes) : bytes(bytes) {
}
template<class return_type>
return_type get_bits(int start, int end) {
auto byte_start = (start - (start % bits_per_byte))/bits_per_byte;
auto byte_end = (end - (end % bits_per_byte))/bits_per_byte;
auto byte_width = byte_end - byte_start;
return_type value = 0;
unsigned char first = bytes[byte_start];
first &= (0xff >> start % 8);
return_type first_wide = first;
first_wide <<= byte_width;
value |= first_wide;
for(auto byte_i = byte_start + 1; byte_i <= byte_end; byte_i++) {
auto byte_offset = (byte_width - byte_i) * bits_per_byte;
unsigned char next_thin = bytes[byte_i];
return_type next_byte = next_thin;
next_byte <<= byte_offset;
value |= next_byte;
}
value >>= (((byte_end + 1) * bits_per_byte) - end) % bits_per_byte;
return value;
}
};
int main() {
BitValues<char> bits(std::vector<char>({'\x78', '\xDA', '\x05', '\x5F', '\x8A', '\xF1', '\x0F', '\xA0'}));
std::cout << bits.get_bits<unsigned>(15, 29) << "\n";
return 0;
}
:
और यहाँ यह कोडिंग पर मेरे प्रयास है, जो सही परिणाम नहीं दे करता है
(कार्रवाई में: http://coliru.stacked-crooked.com/a/261d32875fcf2dc0)
मैं बस इन बिट मैनिप्लेशंस के आसपास अपने सिर को लपेटने के लिए प्रतीत नहीं कर सकता, और मुझे डिबगिंग बहुत मुश्किल लगता है! अगर कोई उपरोक्त कोड को सही कर सकता है, या किसी भी तरह से मेरी मदद कर सकता है, तो इसकी सराहना की जाएगी!
संपादित करें:
- मेरे बाइट्स 8 बिट लंबे
- वापस जाने के लिए हो सकता है 8,16,32 या 64 बिट्स wside
- पूर्णांक बड़ा endian में संग्रहित है पूर्णांक हैं
यह:
मैं इस के अपने कार्यान्वयन जो नीचे दाएं से बाएं से बिट श्रृंखला बनाता है, उनके सही स्थिति में बिट्स रखने तो साथ शुरू करने के लिए है कि उपरोक्त दो समस्याओं से बचा रहे हैं डाल दिया है हस्ताक्षर किए गए पूर्णांक के लिए बहुत अच्छा काम करता है धन्यवाद! मैं सिर्फ हस्ताक्षर किए गए पूर्णांक की जांच करने के मिनट में हूं - मैं पूरी तरह से * सुनिश्चित नहीं हूं कि 'get_bits (14, 22) 'के लिए मेरा वांछित आउटपुट क्या है! मैं जल्द ही उस पर अपडेट के साथ उम्मीद करूँगा, या अगर मुझे लगता है कि यह वांछित व्यवहार है, तो आपके लिए एक टिक मार्क :) –
Ell
ऐसा लगता है कि यह कोड 'बिट्स.get_बीट्स (0, 32) के लिए काम नहीं करता है। ; '- यह अपेक्षित' 519053860746' –
Ell
की बजाय शून्य लौटाता है आप सही हैं। बग अंत में मास्क किए जाने के तरीके के कारण है। बाएं शिफ्ट को थोड़ा सा महत्व देता है जिससे 0 का बिटमैस्क होता है। मैंने एक फिक्स जोड़ा है। – Cookyt