Tôi có một số vector<char>
và tôi muốn có thể lấy số nguyên không dấu từ một dải bit trong vectơ. Ví dụ.Nhận số nguyên từ bit bên trong `std :: vector <char>`
Và tôi dường như không thể để có thể viết các thao tác đúng để có được những kết quả mong muốn. Thuật toán định của tôi đi như thế này:
&
byte đầu tiên với(0xff >> unused bits in byte on the left)
<<
kết quả trái số byte đầu ra * số bit trong một byte|
này với sản lượng thức- Đối với mỗi byte tiếp theo:
<<
còn lại bởi (byte width - index) * bits per byte|
byte này với sản lượng thức
|
byte cuối cùng (không chuyển) với sản lượng thức>>
đầu ra cuối cùng của số bit không sử dụng trong các byte trên quyền
Và đây là nỗ lực của tôi trong việc mã hóa nó, không cung cấp kết quả chính xác:
#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;
}
(Đang hoạt động: http://coliru.stacked-crooked.com/a/261d32875fcf2dc0)
Tôi dường như không thể quấn đầu xung quanh các thao tác bit này, và tôi thấy việc gỡ lỗi rất khó! Nếu bất cứ ai có thể sửa mã trên, hoặc giúp tôi bằng bất kỳ cách nào, nó sẽ được nhiều người đánh giá cao!
Edit:
- byte của tôi là 8 bit dài
- Các nguyên trở lại có thể là 8,16,32 hoặc 64 bit wside
- Các số nguyên được lưu trữ trong big endian
này hoạt động tuyệt vời cho các số nguyên không dấu cảm ơn bạn! Tôi chỉ ở phút điều tra các số nguyên đã ký - Tôi không * hoàn toàn * chắc chắn rằng kết quả mong muốn của tôi cho 'get_bits (14, 22)' là vào phút! Tôi sẽ sớm quay lại với một bản cập nhật về điều đó, hoặc nếu tôi thấy đây là hành vi mong muốn, một dấu chọn cho bạn :) –
Ell
Dường như mã này không hoạt động đối với 'bits.get_bits (0, 32) ; '- nó trả về không thay vì mong đợi' 519053860746' –
Ell
Bạn nói đúng. Lỗi này là do cách kết quả được che dấu ở cuối. Việc dịch chuyển trái di chuyển bit ra khỏi tầm quan trọng gây ra một bitmask của 0. Tôi đã thêm một sửa chữa. – Cookyt