El código δ de Elias o código delta de Elias es un código universal que codifica los números enteros positivos desarrollado por Peter Elias . [1] : 200
Para codificar un número X ≥ 1:
Una forma equivalente de expresar el mismo proceso:
Para representar un número , la delta de Elias (δ) utiliza bits. [1] : 200 Esto es útil para números enteros muy grandes, donde los bits de la representación codificada general terminan siendo menores [que los que se podrían obtener usando la codificación gamma de Elias ] debido a la parte de la expresión anterior.
El código comienza usando en lugar de :
Para decodificar un entero codificado con delta de Elias:
Ejemplo:
0010100111. 2 ceros a la izquierda en 0012. lee 2 bits más, es decir 001013. decodificar N+1 = 00101 = 54. Obtenga N = 5 − 1 = 4 bits restantes para el código completo, es decir, '0011'5. número codificado = 2 4 + 3 = 19
Este código se puede generalizar a cero o a números enteros negativos de las mismas formas descritas en la codificación gamma de Elias .
void eliasDeltaEncode ( char * fuente , char * destino ) { IntReader intreader ( fuente ); BitWriter bitwriter ( destino ); mientras ( intreader . hasLeft ()) { int num = intreader . obtenerInt (); longitud int = 0 ; int longitudDeLen = 0 ; len = 1 + piso ( log2 ( num ) ); // calcular 1+piso(log2(num)) lengthOfLen = piso ( log2 ( len )); // calcular piso(log2(len)) para ( int i = lengthOfLen ; i > 0 ; -- i ) bitwriter.outputBit ( 0 ); para ( int i = lengthOfLen ; i >= 0 ; -- i ) bitwriter.outputBit (( len >> i ) & 1 ) ; para ( int i = len -2 ; i > = 0 ; i -- ) bitwriter.outputBit ( ( num >> i ) & 1 ) ; } bitwriter.close ( ) ; intreader.close ( ) ; }
void eliasDeltaDecode ( char * fuente , char * destino ) { BitReader bitreader ( fuente ) ; IntWriter intwriter ( destino ); while ( bitreader.hasLeft ( ) ) { int num = 1 ; int len = 1 ; int lengthOfLen = 0 ; while ( ! bitreader.inputBit ()) // potencialmente peligroso con archivos malformados. lengthOfLen ++ ; for ( int i = 0 ; i < lengthOfLen ; i ++ ) { len << = 1 ; if ( bitreader.inputBit ()) len | = 1 ; } for ( int i = 0 ; i < len -1 ; i ++ ) { num << = 1 ; if ( bitreader.inputBit ( ) ) num | = 1 ; } intwriter.putInt ( num ) ; // escribe el valor } bitreader . close (); intwriter . close (); }
La codificación delta de Elias no codifica números enteros cero o negativos. Una forma de codificar todos los números enteros no negativos es sumar 1 antes de codificar y luego restar 1 después de decodificar. Una forma de codificar todos los números enteros es configurar una biyección , asignando todos los números enteros (0, 1, −1, 2, −2, 3, −3, ...) a números enteros estrictamente positivos (1, 2, 3, 4, 5, 6, 7, ...) antes de codificar. Esta biyección se puede realizar utilizando la codificación "ZigZag" de Protocol Buffers (que no debe confundirse con el código Zigzag ni con la codificación de entropía JPEG Zig-zag ).