코드 실행 중 byteOffset과 bitOffset을 구했으면, byteOffset을 mBuffer 배열에 대한 인덱스로 삼아 기록할 바이트 위치를 찾는다. 다음 그 안에 들어 있는 데이터를 bitOffset만큼 왼쪽으로 시프트한 뒤 사용자가 넘겨준 값과 비트 OR 연산으로 합친다. 처음 숫자 13을 쓸 때는 두 오프셋 모두 0이므로 그다지 어려울 게 없다. 이제 WriteBits(52, 6)을 호출할 때 스트림에서 어떤 동작이 일어나는지 그림 4-5를 통해 살펴보자.
▲ 그림 4-5 두 번째 WriteBits 호출 직후 스트림 버퍼
이 시점에 mBitHead는 5가 된다. 즉, byteOffset은 0이고 bitOffset이 5가 된다.
숫자 52를 5비트 왼쪽으로 시프트하면 그림 4-6의 결과가 나온다.
▲ 그림 4-6 52를 왼쪽으로 5비트 시프트한 이진수 표현