더북(TheBook)

최상위 비트들이 밖으로 시프트되어 버려지고 하위 비트들이 이제 상위 비트가 되었음을 주목하자. 그림 4-7은 이 값을 버퍼의 0번 바이트에 비트 OR 연산한 결과이다.

 

▲ 그림 4-7 52를 왼쪽으로 5비트 시프트하여 스트림 버퍼에 비트 OR 연산

 

0번 바이트가 이제 가득 찼다. 하지만 아직 6비트 중 3비트만 스트림에 기록되었고 나머지 3비트는 왼쪽으로 시프트하다 오버플로, 즉 넘쳐버렸다. WriteBits() 코드의 이후 부분에서 이를 감지하고 처리한다. 코드 실행 시 8에서 bitOffset를 빼면 대상 바이트에 기록하고 남은 비트 수가 몇 개인지 계산할 수 있다. 이 경우엔 3이 나오는데 실제 넣을 수 있었던 비트 수가 3이란 뜻이다. 남은 비트 수가 기록할 비트 수보다 적은 경우, 오버플로 처리 분기를 실행한다.

오버플로 분기에선 목표를 갱신하여 다음 바이트로 전진한다. 목표가 된 바이트에 비트 내용을 OR하기 전에, 주어진 inData를 남은 비트 수만큼 오른쪽으로 시프트한다. 그림 4-8에 52를 오른쪽으로 3비트 시프트한 결과가 있다.

▲ 그림 4-8 52를 오른쪽으로 3비트 시프트

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