이제 코드가 실행되고 나면 mbs.mBuffer가 가리키는 메모리에 그림 4-4처럼 두 값이 기록된다.
▲ 그림 4-4 5비트 길이 13과 6비트 길이 62를 포함한 스트림 버퍼
이것을 보면 숫자 13이 0번 바이트의 0~5번 비트를 점유하고, 숫자 52는 총 6비트 중 뒤쪽 3비트 ‘100’이 0번 바이트의 5~7번 비트에, 앞쪽 3비트 ‘110’은 1번 바이트의 0~2번 비트로 들어가 있다.
코드를 한 줄씩 짚어보면 동작 구조가 보다 잘 드러난다. 스트림을 지금 막 만들었다 치면 mBitCapacity는 256이고 mBitHead는 0이며 재할당 필요가 없도록 스트림에 넉넉한 공간이 있다. mBitHead는 다음번 스트림에 기록할 비트 위치를 나타내는 역할을 하는데, 먼저 mBitHead를 바이트 인덱스와 그 바이트에서의 비트 인덱스로 쪼갠다. 1바이트는 8비트이므로 mBitHead를
8로 나누면 바이트 인덱스를 얻을 수 있다. 나눗셈 대신 오른쪽으로 3 시프트해도 된다. 마찬가지로 한 바이트 내 비트 인덱스는 8에 대한 나머지, 또는 시프트하다 버려지는 3비트를 구하면 된다. 꽉찬 3비트를 나타내는 이진수는 ‘111’, 즉 0x07이므로 mBitHead에 비트 AND 연산 0x07로 거르면 그 3비트를 얻을 수 있다. 첫 호출에서 13을 기록할 때 mBitHead는 0. 따라서 byteOffset과 bitOffset 둘 다 0이다.