Mam vector<char>
i chcę móc uzyskać liczbę całkowitą bez znaku z zakresu bitów w obrębie wektora. Na przykład.Uzyskaj Integer From Bits Inside `std :: vector <char>`
I nie wydaje się być w stanie napisać odpowiednie działania, aby uzyskać pożądany wynik. My przeznaczone algorytm idzie tak:
&
pierwszy bajt z(0xff >> unused bits in byte on the left)
<<
wyniku lewo liczbę bajtów wyjściowych * liczba bitów w bajcie|
to z ostatecznym wyjściem- Dla każdego kolejnego bajtu:
<<
pozostawione przez (szerokość bajtu - indeks) * bity na bajt|
ten bajt z końcowym wyjściu
|
ostatni bajt (nie przesunął) z końcowym wyjściu>>
końcowy wynik przez ilość zużytego bitów bajtu w prawo
I tu jest moja próba go kodowania, który nie daje poprawny wynik:
#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;
}
(w akcji: http://coliru.stacked-crooked.com/a/261d32875fcf2dc0)
Po prostu nie mogę objąć głowy tymi manipulacjami bitów i uważam, że debugowanie jest bardzo trudne! Jeśli ktokolwiek może poprawić powyższy kod lub pomóc mi w jakikolwiek sposób, byłoby to bardzo cenne!
Edycja:
- Kim bajtów 8 bitów
- Liczba całkowita powrotu może być 8,16,32 lub 64 bitów wside
- Liczba całkowita jest przechowywany w konfiguracji Big Endian
ten działa doskonale dla liczb całkowitych bez znaku dziękuję! Jestem właśnie na chwilę badając podpisane liczby całkowite - nie jestem * całkowicie * pewny, jaki jest mój pożądany wynik dla 'get_bits (14, 22)' z minuty na minutę! Wrócę z nadzieją niedługo z aktualizacją, lub jeśli uzna to za pożądane zachowanie, oznaczenie za Ciebie :) –
Ell
Wygląda na to, że ten kod nie działa dla 'bits.get_bits (0, 32) ; '- zwraca zero zamiast oczekiwanego' 519053860746' –
Ell
Masz rację. Błąd wynika ze sposobu zamaskowania wyniku na końcu. Lewe przesunięcie przesuwa bit o istotność powodując maskę bitową równą 0. Dodałem poprawkę. – Cookyt