Levenshtein coding is auniversal code encoding the non-negative integers developed byVladimir Levenshtein.[1][2]
The code ofzero is "0"; to code apositive number:
The code begins:
| Number | Encoding | Implied probability | |
|---|---|---|---|
| 0 | 0 | 1/2 | |
| 1 | 10 | 1/4 | |
| 2 | 110 0 | 1/16 | |
| 3 | 110 1 | 1/16 | |
| 4 | 1110 0 00 | 1/128 | |
| 5 | 1110 0 01 | 1/128 | |
| 6 | 1110 0 10 | 1/128 | |
| 7 | 1110 0 11 | 1/128 | |
| 8 | 1110 1 000 | 1/256 | |
| 9 | 1110 1 001 | 1/256 | |
| 10 | 1110 1 010 | 1/256 | |
| 11 | 1110 1 011 | 1/256 | |
| 12 | 1110 1 100 | 1/256 | |
| 13 | 1110 1 101 | 1/256 | |
| 14 | 1110 1 110 | 1/256 | |
| 15 | 1110 1 111 | 1/256 | |
| 16 | 11110 0 00 0000 | 1/4096 | |
| 17 | 11110 0 00 0001 | 1/4096 | |
To decode a Levenshtein-coded integer:
The Levenshtein code of a positive integer is always one bit longer than theElias 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.
voidlevenshteinEncode(char*source,char*dest){IntReaderintreader(source);BitWriterbitwriter(dest);while(intreader.hasLeft()){intnum=intreader.getInt();if(num==0)bitwriter.outputBit(0);else{intc=0;BitStackbits;do{intm=0;for(inttemp=num;temp>1;temp>>=1)// calculate floor(log2(num))++m;for(inti=0;i<m;++i)bits.pushBit((num>>i)&1);num=m;++c;}while(num>0);for(inti=0;i<c;++i)bitwriter.outputBit(1);bitwriter.outputBit(0);while(bits.length()>0)bitwriter.outputBit(bits.popBit());}}}
voidlevenshteinDecode(char*source,char*dest){BitReaderbitreader(source);IntWriterintwriter(dest);while(bitreader.hasLeft()){intn=0;while(bitreader.inputBit())// potentially dangerous with malformed files.++n;intnum;if(n==0)num=0;else{num=1;for(inti=0;i<n-1;++i){intval=1;for(intj=0;j<num;++j)val=(val<<1)|bitreader.inputBit();num=val;}}intwriter.putInt(num);// write out the value}bitreader.close();intwriter.close();}