public void EncodeInRange(long value, int first, int last, double sum) { if (first >= last) { return; } double sumHalf = sum / 2; double currentSum = 0; for (int i = first; i <= last; i++) { ShannonItem item = values[i]; currentSum += item.probability; if (item.value == value) { int halfIndex = GetHalfIndex(sumHalf, first, last); if (i >= halfIndex) { inputOutput.WriteBit(true); EncodeInRange(value, halfIndex, last, sumHalf); return; } else { inputOutput.WriteBit(false); EncodeInRange(value, first, halfIndex - 1, sumHalf); return; } } } }
public int GetHalfIndex(double sumHalf, int first, int last) { long currentSum = 0; for (int i = first; i <= last; i++) { ShannonItem item = values[i]; currentSum += item.probability; if (currentSum > sumHalf) { if (i == first) { return(i + 1); } return(i); } } throw new Exception("Half index not found"); }