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 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); }
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); }