비트 스트림의 인터페이스는 바이트 스트림과 비슷하지만, 바이트 개수가 아닌 비트 개수를 인자로 지정한다는 차이가 있다. 생성자, 소멸자, 확장에 따른 재할당 등 나머지는 비슷하다. 새 기능은 코드 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); }