것은 내가 vector<char>
을 가지고 있고이 벡터 내에서 비트의 범위에서 부호없는 정수를 얻을 수 있어야합니다. 예 :비트 내부`표준에서 정수를 가져 오기 : 벡터 <char>`
내가 원하는 출력을 얻을 수있는 올바른 쓰기 작업을 할 수없는 것. 내 의도 된 알고리즘은 다음과 같이 진행한다 : (0xff >> unused bits in byte on the left)
<<
결과와 첫번째 바이트가 출력 된 바이트 수를 왼쪽
&
* 최종 출력 바이트|
이 비트 수- 다음 바이트마다 :
<<
바이트 단위로 남은 비트 012 3,516,
|
최종 출력>>
과 최종 출력
|
(시프트되지 않은) 최종 바이트, 바이트 오른쪽
#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)
이 비트 조작에 관한 내 머리를 감싸고있는 것처럼 보일 수 없으며, 디버깅이 매우 어려워졌습니다! 누구든지 위의 코드를 수정하거나 어떤 식 으로든 나를 도울 수 있다면, 많은 도움이 될 것입니다!
편집 : 내 바이트
이를 :
나는 위의 두 가지 문제점을 피할 수 있도록 시작하는 올바른 위치에 비트를 배치, 오른쪽에서 왼쪽으로 비트 문자열을 구축하는 아래이 내 구현을 넣었습니다 부호없는 정수에 효과적입니다. 감사합니다! 난 그냥 정수를 조사하는 순간이다.'get_bits (14, 22)'에 대한 내 원하는 출력이 분당 무엇인지 완전히 확신하지는 않는다! 나는 희망에 따라 곧 업데이트 될 것이다. 또는 이것이 바람직한 행동, 너를위한 눈금 표시라고 생각한다면 :) –
Ell
이 코드는'bits.get_bits에 대해 작동하지 않는다. (0, 32) ; - 예상 한'519053860746' 대신 0을 반환합니다 –
Ell
맞습니다. 이 버그는 그 결과가 마지막에 가려지는 방식 때문입니다. 왼쪽으로 이동하면 비트 마스크가 0으로 바뀌어 의미가 없어집니다. 수정 사항을 추가했습니다. – Cookyt