Levenshtein coding is a universal code encoding the non-negative integers developed by Vladimir Levenshtein.[1][2]
The code of zero is "0"; to code a positive number:
The code begins:
0
10
110 0
110 1
1110 0 00
1110 0 01
1110 0 10
1110 0 11
1110 1 000
1110 1 001
1110 1 010
1110 1 011
1110 1 100
1110 1 101
1110 1 110
1110 1 111
11110 0 00 0000
11110 0 00 0001
To decode a Levenshtein-coded integer:
The Levenshtein code of a positive integer is always one bit longer than the Elias omega code of that integer. However, there is a Levenshtein code for zero, whereas Elias omega coding would require the numbers to be shifted so that a zero is represented by the code for one instead.
void levenshteinEncode(char* source, char* dest) { IntReader intreader(source); BitWriter bitwriter(dest); while (intreader.hasLeft()) { int num = intreader.getInt(); if (num == 0) bitwriter.outputBit(0); else { int c = 0; BitStack bits; do { int m = 0; for (int temp = num; temp > 1; temp>>=1) // calculate floor(log2(num)) ++m; for (int i=0; i < m; ++i) bits.pushBit((num >> i) & 1); num = m; ++c; } while (num > 0); for (int i=0; i < c; ++i) bitwriter.outputBit(1); bitwriter.outputBit(0); while (bits.length() > 0) bitwriter.outputBit(bits.popBit()); } } }
void levenshteinDecode(char* source, char* dest) { BitReader bitreader(source); IntWriter intwriter(dest); while (bitreader.hasLeft()) { int n = 0; while (bitreader.inputBit()) // potentially dangerous with malformed files. ++n; int num; if (n == 0) num = 0; else { num = 1; for (int i = 0; i < n-1; ++i) { int val = 1; for (int j = 0; j < num; ++j) val = (val << 1) | bitreader.inputBit(); num = val; } } intwriter.putInt(num); // write out the value } bitreader.close(); intwriter.close(); }