-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Elias.hpp
149 lines (123 loc) · 3.5 KB
/
Elias.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/** @file Elias.hpp
* Algoritmos de compresión para números
*
* Tomados de: Compression and coding algorithms
* Escrito por Alistair Moffat, Andrew Turpin
*
* http://books.google.com.co/books?id=czwqegW_NCAC&pg=PA42&lpg=PA42&dq=Binary+Interpolative+Coding&source=bl&ots=SJ0D8VHszl&sig=nkk2CIg4rpskJkCSh6NnRimC3eU&hl=es&ei=vYqWSteBLoyvtgfXiOy-Dg&sa=X&oi=book_result&ct=result&resnum=7#v=onepage&q=Binary%20Interpolative%20Coding&f=false
*
* @package Mt77
* @author Vladimir Támara Patiño. vtamara@pasosdeJesus.org
* Dominio público. 2009. Sin garantías
* http://creativecommons.org/licenses/publicdomain/
* @version $Id: Elias.hpp,v 1.5 2010/01/18 16:12:50 vtamara Exp $
*/
#if !defined(Elias_hpp)
#define Elias_hpp
#include <vector>
#include <string>
#include <stdint.h>
using namespace std;
/**
* Techo de logaritmo en base 2
*/
uint32_t techo_logb2(uint64_t x);
/**
* Piso de logaritmo en base 2
*/
uint32_t piso_logb2(uint32_t x);
/**
* Potencia de 2, pot2(e) es 2^e
*/
uint64_t pot2(uint32_t e);
/**
* Representación de un binario como cadena imprimible de unos y ceros
* con espacios cada 8 digitos
*/
string bin2ascii(string bs);
/**
* Representación de un vector de booleanos como cadena imprimible de unos
* y ceros, con espacios cada 8 digitos
*/
string vb2ascii(vector<bool> &vb);
/**
* Convierte de vector de booelanos a binario
*/
string vb2bin(vector<bool> &vb);
/**
* Convierte de vector de booleanos a cadena de unos y ceros
*/
string vb2str(vector<bool> &vb);
/**
* Convierte de cadena de unos y ceros a vector de booleanos
*/
vector<bool> str2vb(string s);
/**
* Codifica entero largo x en unario como vector de booleanos
*/
void codifica_unario(uint64_t x, vector<bool> &vb);
/**
* Decodifica unario en vector de booleanos a entero
*/
uint64_t decodifica_unario(vector<bool> &vb);
/**
* Convierte un entero a binario de máximo nbits digitos
*/
void pone_un_entero(uint64_t x, uint32_t nbits, vector<bool> &vb);
/**
* Convierte un binario de máximo nbits digitos a entero
*/
uint64_t toma_un_entero(uint32_t nbits, vector<bool> &vb);
/**
* Convierte x a su codificación Gama de Elias.
*/
void codifica_elias_gama(uint32_t x, vector<bool> &vb);
/**
* Convierte de codificaico gamma de Elias a entero
*/
uint64_t
decodifica_elias_gama(vector<bool> &vb);
/**
* Lee un número en codificación elias gama de un flujo.
* @param is flujo de entrada
**/
uint64_t
lee_elias_gama(std::istream &is) noexcept(false);
/**
* Lee rapidamente un número en codificación elias gama de un flujo.
* @param is flujo de entrada
**/
uint64_t
lee_elias_gama2(std::istream &is) noexcept(false);
/**
* Escribe al flujo os un entero en codificación gama de Elias.
* @param os Flujo de salida
* @param n Número por escribir
**/
void
escribe_elias_gama(std::ostream &os, uint32_t n);
/**
* Escribe rapidamente al flujo os un entero en codificación gama de Elias.
* @param os Flujo de salida
* @param n Número por escribir
**/
void
escribe_elias_gama2(std::ostream &os, uint32_t n);
/**
* Retorna espacio que requeriría en un flujo codificar un número en
* codificación gama de Elías
* @param n número
*
* @return longitud
*/
uint32_t
long_elias_gama(uint64_t n);
/**
* Convierte un entero menor o igual a n a su codificación binaria mínima
*/
void codifica_binaria_minima(uint64_t x, uint32_t n, vector<bool> &vb);
/**
* Convierte vb de codificación binaria mínima con máximo n a entero
*/
uint64_t decodifica_binaria_minima(uint32_t n, vector<bool> &vb);
#endif