C++에서 비트셋을 파일 (아마도 iostream을 사용하여)로 쓰는 공간을 절약 할 수 있는지 궁금합니다. 비트 셋을 비트 8의 크기로 분해 한 다음 각 개별 비트 세트를 파일에 쓰면 공간이 절약됩니까? 이것에 대한 당신의 생각은 무엇입니까? 이것은 데이터 압축의 의도입니다.C++에서 파일에 비트 세트를 쓰는 공간 절약
0
A
답변
0
일반적으로 bitset에 비트 당 1 바이트를 쓰면 8 개 요소를 1 바이트에 저장하면 한계에 7/8 공간이 저장됩니다 (비트 세트의 크기를 어딘가에 저장해야합니다. 당연하지).
예, 이것은 bitset
비트 (7/8 헤드)마다 하나 개의 문자를 사용하여 기록 :
for (size_t i=0, n=bs.size(); i<n; ++i)
stream << bs[i];
를이 저장 동안 (우리 끝에 패딩 무시한다면) 최적 컴팩트 :
for (size_t i=0, n=(bs.size() + 1) % 8; i<n; ++i) {
uint8_t byte=0;
for (size_t j=0; j<8; ++j)
byte = (byte << 1) | bs[i*8 + j];
stream << byte;
}
을
uint8_t
은 표준 C++ 03이 아닙니다. C99의 <stdint.h>
또는 C++ 0x의 <cstdint>
에 있습니다. 원하는 경우 std::bitset<8>
을 사용할 수도 있습니다.
0
대신 boost::dynamic_bitset
을 사용하는 경우 기본 블록 유형을 지정하고 to_block_range
및 from_block_range
함수로 검색 할 수 있습니다. 나는 비트 세트를 작성하는 경우 수의
http://www.boost.org/doc/libs/1_46_0/libs/dynamic_bitset/dynamic_bitset.html#to_block_range
난 그냥 쓰기의 행동을 잘 모르겠어요 (예를 들어, 블록 타입으로
unsigned char
을 사용하고 바이너리 모드 스트림에 저장) 크기 600을 말하십시오. – DogDog@Apoc : 나는 당신이 두려워하는 것을 이해하지 못합니다. 몇 가지 코드를 게시 할 수 있습니까? –
@Apoc : 비트 세트가 매우 크고 대신에 boost :: dynamic_bitset (http://www.boost.org/doc/libs/release/libs/dynamic_bitset/dynamic_bitset.html)을 사용할 수 있습니다. 가변 크기. –