더북(TheBook)

비트 스트림의 인터페이스는 바이트 스트림과 비슷하지만, 바이트 개수가 아닌 비트 개수를 인자로 지정한다는 차이가 있다. 생성자, 소멸자, 확장에 따른 재할당 등 나머지는 비슷하다. 새 기능은 코드 4-6의 WriteBits() 두 벌에 걸쳐 구현한다.

코드 4-6 출력 메모리 비트 스트림의 구현

void OutputMemoryBitStream::WriteBits(
    uint8_t inData,
    size_t inBitCount)
{
    uint32_t nextBitHead = mBitHead + static_cast<uint32_t>(inBitCount);
    if (nextBitHead > mBitCapacity)
        ReallocBuffer(std::max(mBitCapacity * 2, nextBitHead));
 
    // 바이트 오프셋: 비트 헤드를 8로 나눔
    // 비트 오프셋 : 8에 대한 나머지
    uint32_t byteOffset = mBitHead >> 3;
    uint32_t bitOffset = mBitHead & 0x7;
 
    // 현재 처리 중 바이트에서 몇 비트를 남길지 계산
    uint8_t currentMask = ~(0xff << bitOffset);
    mBuffer[byteOffset] = (mBuffer[byteOffset] & currentMask)
        | (inData << bitOffset);
 
    // 기록할 바이트에 몇 비트가 아직 남아있나 계산
    uint32_t bitsFreeThisByte = 8 - bitOffset;
 
    // 공간이 모자라면 다음 바이트에 넘김
    if (bitsFreeThisByte < inBitCount)
    {
        // 다음 바이트에 나머지 비트를 기록
        mBuffer[byteOffset + 1] = inData >> bitsFreeThisByte;
    }
 
    mBitHead = nextBitHead;
}
 
void OutputMemoryBitStream::WriteBits(
    const void* inData,
    size_t inBitCount)
{
    const char* srcByte = static_cast<const char*>(inData);
 
    // 바이트를 하나씩 모두 기록
    while (inBitCount > 8)
    {
        WriteBits(*srcByte, 8);
        ++srcByte;
        inBitCount -= 8;
    }
 
    // 아직 남은 비트를 기록
    if (inBitCount > 0)
        WriteBits(*srcByte, inBitCount);
}

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.