public int[] ReadValues(long bitsToRead, IBitReader bitReader)
        {
            var arrayLength = bitReader.ReadNBits(32);

            var values       = new List <int>();
            var encodedValue = new TableEncodedValue();

            for (int i = 0; i < arrayLength; i++)
            {
                int numberOf1Before0 = 0;
                while (bitReader.ReadNBits(1) != 0)
                {
                    numberOf1Before0++;
                }

                if (numberOf1Before0 == 0)
                {
                    values.Add(0);
                }
                else
                {
                    encodedValue.NumberOf1Before0 = numberOf1Before0;
                    encodedValue.ValueAfter0      = (int)bitReader.ReadNBits(numberOf1Before0);

                    values.Add(TableValueEncoding.DecodeValue(encodedValue));
                }
            }

            return(values.ToArray());
        }
        public void WriteValues(int[] values, IBitWriter bitWriter)
        {
            bitWriter.WriteNBits(32, (uint)values.Length);

            foreach (var value in values)
            {
                var encodedValue = TableValueEncoding.EncodeValue(value);

                if (encodedValue.NumberOf1Before0 == 0)
                {
                    bitWriter.WriteNBits(1, 0);
                }
                else
                {
                    for (int k = 0; k < encodedValue.NumberOf1Before0; k++)
                    {
                        bitWriter.WriteNBits(1, 1);
                    }

                    bitWriter.WriteNBits(1, 0);

                    bitWriter.WriteNBits(encodedValue.NumberOf1Before0, (uint)encodedValue.ValueAfter0);
                }
            }
        }