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());
        }
Beispiel #2
0
        public static int DecodeValue(TableEncodedValue encodedValue)
        {
            int xLeftLimit = -((int)Math.Pow(2, encodedValue.NumberOf1Before0) - 1);

            if (xLeftLimit + encodedValue.ValueAfter0 >= xLeftLimit / 2)
            {
                return(encodedValue.ValueAfter0);
            }

            return(xLeftLimit + encodedValue.ValueAfter0);
        }
Beispiel #3
0
        public static TableEncodedValue EncodeValue(int value)
        {
            var encodedValue = new TableEncodedValue();

            if (value == 0)
            {
                return(encodedValue);
            }

            encodedValue.NumberOf1Before0 = (int)Math.Log(Math.Abs(value), 2) + 1;

            if (value < 0)
            {
                int xLimit = (int)Math.Pow(2, encodedValue.NumberOf1Before0) - 1;
                encodedValue.ValueAfter0 = value + xLimit;
            }
            else
            {
                encodedValue.ValueAfter0 = value;
            }

            return(encodedValue);
        }