0

C++에서 비트셋을 파일 (아마도 iostream을 사용하여)로 쓰는 공간을 절약 할 수 있는지 궁금합니다. 비트 셋을 비트 8의 크기로 분해 한 다음 각 개별 비트 세트를 파일에 쓰면 공간이 절약됩니까? 이것에 대한 당신의 생각은 무엇입니까? 이것은 데이터 압축의 의도입니다.C++에서 파일에 비트 세트를 쓰는 공간 절약

답변

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

난 그냥 쓰기의 행동을 잘 모르겠어요 (예를 들어, 블록 타입으로 unsigned char을 사용하고 바이너리 모드 스트림에 저장) 크기 600을 말하십시오. – DogDog

+0

@Apoc : 나는 당신이 두려워하는 것을 이해하지 못합니다. 몇 가지 코드를 게시 할 수 있습니까? –

+0

@Apoc : 비트 세트가 매우 크고 대신에 boost :: dynamic_bitset (http://www.boost.org/doc/libs/release/libs/dynamic_bitset/dynamic_bitset.html)을 사용할 수 있습니다. 가변 크기. –