public class BitWriter(Stream stream)
{
private uint _buffer;
private int _count;
// write `code` with a number of `bits` (Most Significant Bit)
public void WriteBits(uint code, int bits)
{
for (var i = bits - 1; i >= 0; i--)
{
var mask = code >> i;
var bit = mask & 1;
_buffer |= bit << _count;
_count++;
// flush buffer
while (_count >= 8)
{
stream.WriteByte((byte)(_buffer & 0xFF));
_buffer >>= 8;
_count -= 8;
}
}
}
public void Flush()
{
if (_count <= 0)
{
return;
}
stream.WriteByte((byte)_buffer);
}
}