Elias.cpp

Ir a la documentación de este archivo.
00001 // vim: set expandtab tabstop=8 shiftwidth=8 foldmethod=marker:
00018 #include <vector>
00019 #include <sstream>
00020 #include <string>
00021 #include <iostream>
00022 #include <iomanip>
00023 #include <math.h>
00024 #include "comun.hpp"
00025 #include "Elias.hpp"
00026 
00027 using namespace std;
00028 
00029 unsigned int techo_logb2(unsigned long x)
00030 {
00031         ASSERT(x>=1);
00032 
00033         int r = 0;
00034         int u = 0;
00035         while (x>1) {
00036                 r++;
00037                 if (x % 2 == 1) {
00038                         u = 1;
00039                 }
00040                 x = x / 2;
00041         }
00042         return r + u;
00043 }
00044 
00045 
00046 /*
00047 unsigned int piso_logb2(unsigned long x) {
00048         ASSERT(x>=1);
00049  
00050         int r = 0;
00051         while (x>1) {
00052                 r++;
00053                 x = x / 2;
00054         }
00055         return r;
00056 } */
00057 
00060 unsigned int piso_logb2(unsigned int n)
00061 {
00062         ASSERT(n>=1);
00063         int pos = 0;
00064         if (n >= 1<<16) {
00065                 n >>= 16;
00066                 pos += 16;
00067         }
00068         if (n >= 1<< 8) {
00069                 n >>=  8;
00070                 pos +=  8;
00071         }
00072         if (n >= 1<< 4) {
00073                 n >>=  4;
00074                 pos +=  4;
00075         }
00076         if (n >= 1<< 2) {
00077                 n >>=  2;
00078                 pos +=  2;
00079         }
00080         if (n >= 1<< 1) {
00081                 pos +=  1;
00082         }
00083         return ((n == 0) ? (-1) : pos);
00084 }
00085 
00086 unsigned long pot2(unsigned int e)
00087 {
00088         ASSERT(e>=0);
00089 
00090         long r=1;
00091         while (e>0) {
00092                 r = r * 2;
00093                 e--;
00094         }
00095         return r;
00096 }
00097 
00098 /*string ulong2ascii(unsigned long n, unsigned int l = 64)
00099 {
00100         stringstream ss("");
00101         unsigned long p2 = 1 << (l-1);
00102         while (p2 > 0) {
00103                 if ((unsigned long)(n & p2) > 0) {
00104                         ss << "1";
00105                 } else {
00106                         ss << "0";
00107                 }
00108                 p2 >>= 1;
00109         }
00110  
00111         return ss.str();
00112 }
00113  
00114 string bin2ascii(string bs)
00115 {
00116         unsigned int i;
00117         stringstream ss("");
00118         string sep = "";
00119         ss << bs.length() << "[" ;
00120         for(i = 0; i < bs.length(); i++) {
00121                 ss << sep << (int)((unsigned char)bs[i]) ;
00122                 sep = " ";
00123         }
00124         ss << "]" ;
00125         return ss.str();
00126 }
00127  
00128  
00129 string vb2ascii(vector<bool> &vb) 
00130 {
00131         stringstream ss("");
00132         ss << vb.size() << "[" ;
00133         unsigned int i, p2 = 128;
00134         short int c = 0;
00135         string sep = "";
00136         for(i = 0; i< vb.size(); i++) {
00137                 c = c | p2 * vb[i];
00138                 p2 >>= 1;
00139                 if (p2 == 0) {
00140                         ss << sep << (int)((unsigned char)c);
00141                         sep = " ";
00142                         p2 = 128;
00143                         c = 0;
00144                 }
00145         }
00146         if (c != 0) {
00147                 ss << sep << (int)((unsigned char)c);
00148         }
00149         ss << "]" ;
00150         return ss.str();
00151  
00152 }
00153  
00154  
00155 string vb2bin(vector<bool> &vb) 
00156 {
00157         stringstream ss("");
00158         //clog << vb.size() << endl;
00159         unsigned int i, p2 = 128;
00160         short int c = 0;
00161         for(i = 0; i< vb.size(); i++) {
00162                 c = c | p2 * vb[i];
00163                 p2 >>= 1;
00164                 if (p2 == 0) {
00165                         ss << (char)c;
00166                         p2 = 128;
00167                         c = 0;
00168                 }
00169         }
00170         if (c != 0) {
00171                 ss << (char)c;
00172         }
00173         return ss.str();
00174 }
00175 */
00176 
00177 string vb2str(vector<bool> &vb)
00178 {
00179         unsigned int i;
00180         stringstream ss;
00181         ss.clear();
00182         ss.str("");
00183         for(i = 0; i < vb.size(); i++) {
00184                 ss << (char)(vb[i] + '0');
00185         }
00186         return ss.str();
00187 }
00188 
00189 
00190 vector<bool> str2vb(string s)
00191 {
00192         vector<bool> vb(0);
00193         stringstream ss(s);
00194         do {
00195                 char c;
00196                 ss >> c;
00197                 if (ss.good()) {
00198                         vb.push_back(c-'0');
00199                 }
00200         } while (!ss.eof());
00201 
00202         return vb;
00203 }
00204 
00205 
00206 void codifica_unario(unsigned long x, vector<bool> &vb)
00207 {
00208         ASSERT(x >= 1);
00209 
00210         while (x > 1) {
00211                 vb.push_back(1);
00212                 x--;
00213         }
00214         vb.push_back(0);
00215 }
00216 
00217 
00218 unsigned long decodifica_unario(vector<bool> &vb)
00219 {
00220         ASSERT(vb.size() > 0);
00221 
00222         long x = 1;
00223         vector<bool>::iterator cv = vb.begin();
00224         short int c = *cv;
00225         vb.erase(cv);
00226 
00227         while (c == 1) {
00228                 x++;
00229                 cv = vb.begin();
00230                 c = *cv;
00231                 vb.erase(cv);
00232         }
00233         return x;
00234 }
00235 
00236 
00237 void pone_un_entero(unsigned long x, unsigned int nbits, vector<bool> &vb)
00238 {
00239         ASSERT(x >= 0);
00240         ASSERT(nbits >= 0);
00241 
00242         int i;
00243         long p2 = 0;
00244         if (nbits>0) {
00245                 p2 = pot2(nbits-1);
00246         }
00247         for(i = nbits - 1; i >= 0; i--) {
00248                 int b = (x / p2) % 2;
00249                 vb.push_back(b);
00250                 p2 = p2 / 2;
00251         }
00252 }
00253 
00254 
00255 unsigned long toma_un_entero(unsigned int nbits, vector<bool> &vb)
00256 {
00257         ASSERT(nbits >= 0);
00258         ASSERT(vb.size() >= nbits);
00259 
00260         long x = 0;
00261         int i;
00262         vector<bool>::iterator cv;
00263         for(i = nbits-1; i >= 0; i--) {
00264                 cv = vb.begin();
00265                 short int b = *cv;
00266                 vb.erase(cv);
00267                 x = 2 * x + b;
00268         }
00269         return x;
00270 }
00271 
00272 
00273 /*void codifica_elias_gama_os(std::ostream &os, unsigned long x)
00274 {
00275         ASSERT(x >= 1);
00276  
00277         int b = 1 + piso_logb2(x);
00278         codifica_unario_os(os, b, vb);
00279         pone_un_entero(x - pot2(b - 1), b - 1, vb);
00280 }
00281 */
00282 
00283 void codifica_elias_gama(unsigned int x, vector<bool> &vb)
00284 {
00285         ASSERT(x >= 1);
00286 
00287         int b = 1 + piso_logb2(x);
00288         codifica_unario(b, vb);
00289         pone_un_entero(x - pot2(b - 1), b - 1, vb);
00290 }
00291 
00292 
00293 unsigned long decodifica_elias_gama(vector<bool> &vb)
00294 {
00295         ASSERT(vb.size() > 0);
00296 
00297         unsigned int b = decodifica_unario(vb);
00298         long x = toma_un_entero(b - 1, vb);
00299         return pot2(b - 1) + x;
00300 }
00301 
00309 unsigned long
00310 lee_elias_gama(std::istream &is) throw (string)
00311 {
00312         vector<bool> vb(0);
00313         vb.clear();
00314 
00315         //clog << "OJO lee_elias_gama(is)" << endl;
00316         unsigned int p2;
00317         int c;
00318         short bit;
00319         do {
00320                 c = is.get();
00321                 //clog << "lei c=" << c << endl;
00322                 if (c == EOF) {
00323                         throw errorFormato(is,
00324                                            "Fin de archivo mientras esperaba unario");
00325                 } else if (c == 255) {
00326                         vb.push_back(1);
00327                         vb.push_back(1);
00328                         vb.push_back(1);
00329                         vb.push_back(1);
00330                         vb.push_back(1);
00331                         vb.push_back(1);
00332                         vb.push_back(1);
00333                         vb.push_back(1);
00334                 }
00335         } while (c == 255);
00336         p2 = 256;
00337         do {
00338                 p2 >>= 1;
00339                 //clog << "c= " << c << ", p2 =" << p2 << endl;
00340                 bit = (c & (short)p2) > 0 ? 1 : 0;
00341                 vb.push_back(bit);
00342                 //clog << "empujó =" << bit << ", c= " << c << endl;
00343         } while (bit == 1 && p2 > 1);
00344 
00345         unsigned int nb = vb.size();
00346         //clog << "nb=" << nb << ", c= " << c << endl;
00347         do {
00348                 //clog << "ac p2=" << p2 << endl;
00349                 while (p2 > 1 && vb.size() < 1+ 2 * (nb-1)) {
00350                         p2 >>= 1;
00351                         //clog << "c=" << c << ", p2 =" << p2 << endl;
00352                         bit = (c & (short)p2) > 0 ? 1 : 0;
00353                         vb.push_back(bit);
00354                         //clog << "empujo " << bit << endl;
00355                 }
00356                 if (vb.size() < 1 + 2 * (nb-1)) {
00357                         c = is.get();
00358                         //clog << "lee c=" << c << endl;
00359                         if (c == EOF) {
00360                                 stringstream ss("");
00361                                 ss << "Fin de archivo, se esperaba binario ("
00362                                 << vb.size() << " < " <<
00363                                 1+ 2*(nb-1)<< ")";
00364                                 throw errorFormato(is, ss.str());
00365                         }
00366                         p2 = 256;
00367                 }
00368                 //clog << "vb.size() = " << vb.size() << ", 2*nb = " << 2*nb << endl;
00369         } while (vb.size() < 1+ 2 * (nb-1));
00370 
00371 
00372         unsigned long lr = decodifica_elias_gama(vb);
00373         //clog << "lr = " << lr << endl;
00374         return lr;
00375 }
00376 
00377 /* Otra versión de la función anterior, pero que se espera sea rápida.
00378  
00379   codifica_elias_gama(1, vb) da 0   ->     00000000 -> 000000
00380   codifica_elias_gama(2, vb) da 100 ->     10000000 -> 000000
00381   codifica_elias_gama(3, vb) da 101
00382   codifica_elias_gama(4, vb) da 11000
00383   codifica_elias_gama(5, vb) da 11001 ->   11001000 -> 0...01
00384   codifica_elias_gama(6, vb) da 11010 ->   11010000 -> 0...10
00385   codifica_elias_gama(7, vb) da 11011 ->   11011000 -> 0...11
00386   codifica_elias_gama(8, vb) da 1110000 -> 11100000 -> 0..000
00387   codifica_elias_gama(9, vb) da 1110001 -> 11100010 -> 0..001
00388  
00389         16 es 
00390         CPPUNIT_ASSERT(rs[0] == (char)B8(11110000));
00391         CPPUNIT_ASSERT(rs[1] == (char)B8(00000000));
00392         
00393         32  es
00394         CPPUNIT_ASSERT(ss.str()[0] == (char)B8(11111000));
00395         CPPUNIT_ASSERT(ss.str()[1] == (char)B8(00000000));
00396  
00397         128
00398         CPPUNIT_ASSERT(ss.str()[0] == (char)B8(11111110));
00399         CPPUNIT_ASSERT(ss.str()[1] == (char)B8(00000000));
00400  
00401         256
00402         CPPUNIT_ASSERT(ss.str()[0] == (char)B8(11111111));
00403         CPPUNIT_ASSERT(ss.str()[1] == (char)B8(00000000));
00404         CPPUNIT_ASSERT(ss.str()[2] == (char)B8(00000000));
00405  
00406         65536
00407         CPPUNIT_ASSERT(ss.str()[0] == (char)B8(11111111));
00408         CPPUNIT_ASSERT(ss.str()[1] == (char)B8(11111111)); 
00409         CPPUNIT_ASSERT(ss.str()[2] == (char)B8(00000000));
00410         CPPUNIT_ASSERT(ss.str()[3] == (char)B8(00000000));
00411         CPPUNIT_ASSERT(ss.str()[4] == (char)B8(00000000));
00412  
00413   Máximo es representable en 31 bits i.e
00414   escribe_elias_gama(ss, (unsigned int)(pot2(32)-1));
00415   que da
00416         CPPUNIT_ASSERT(ss.str()[0] == (char)B8(11111111));
00417         CPPUNIT_ASSERT(ss.str()[1] == (char)B8(11111111)); 
00418         CPPUNIT_ASSERT(ss.str()[2] == (char)B8(11111111));
00419         CPPUNIT_ASSERT(ss.str()[3] == (char)B8(11111110));
00420         CPPUNIT_ASSERT(ss.str()[4] == (char)B8(11111111));
00421         CPPUNIT_ASSERT(ss.str()[5] == (char)B8(11111111));
00422         CPPUNIT_ASSERT(ss.str()[6] == (char)B8(11111111));
00423         CPPUNIT_ASSERT(ss.str()[7] == (char)B8(11111110));
00424  
00425         Así que se leen entre 1 y 8 bytes.
00426         1 si n está entre 2^0=1 y 2^4-1=15
00427         2 si n está entre 2^4=16 y 2^8-1=255
00428         3 si n está entre 2^8=256 y 2^12-1=4095
00429         4 si n está entre 2^12=4096 y 2^16-1=65535
00430         5 si n está entre 2^16=65536 y 2^20-1
00431         6 si n está entre 2^20 y 2^24-1
00432         7 si n está entre 2^24 y 2^28-1
00433         8 si n está entre 2^28 y 2^32-1
00434  
00435   */
00436 unsigned long
00437 lee_elias_gama2(std::istream &is) throw (string)
00438 {
00439         //clog << "OJO lee_elias_gama2(is)" << endl;
00440         unsigned int p2;
00441         int c;
00442         short bit;
00443         unsigned int nbits = 0;
00444         unsigned long p2f = 1;
00445 
00446         // Primero leemos en unario en nbits
00447         // Al tiempo vamos calculando 2^nbits en p2f
00448         //clog << "OJO Por leer unario y calcular p2f" << endl;
00449         do {
00450                 c = is.get();
00451                 //clog << "OJO leido c=" << c << " = " << ulong2ascii(c, 8) << endl;
00452                 //clog.clear();
00453 
00454                 if (c == EOF) {
00455                         throw errorFormato(is,
00456                                            "Fin de archivo mientras esperaba unario");
00457                 } else if (c == 255) {
00458                         nbits += 8;
00459                         p2f <<= 8;
00460 
00461                 }
00462         } while (c == 255);
00463         //clog << "OJO Tras primer ciclo nbits=" << nbits << " y p2f=" << p2f << endl;
00464         p2 = 256;
00465         do {
00466                 p2 >>= 1;
00467                 bit = (c & (short)p2) > 0 ? 1 : 0;
00468                 //clog << "OJO en segundo ciclo c= " << c << ", p2 =" << p2 << ", bit=" << bit << endl;
00469                 if (bit == 1) {
00470                         nbits++;
00471                         p2f <<= 1;
00472                 }
00473         } while (bit == 1 && p2 > 1);
00474         //clog << "OJO Tras segundo ciclo nbits=" << nbits << " y p2f=" << p2f << endl;
00475 
00476         ASSERT(nbits<=31);
00477 
00478         // codifica_elias_gama(7, vb) da 11011 se representa con caracter 11011000 debe quedar 0...11
00479         // nbits=2,  nbits%8=2
00480 
00481         // Ahora leemos nbits bits en binario en ui
00482 
00483         /* nbits%8 = 2^p2 */
00484 
00485         //clog << "OJO Por leer " << nbits << " bits binarios en ui" << endl;
00486         unsigned int bl;
00487         if (nbits <= 3) {
00488                 bl = nbits;
00489                 /*      } else if (nbits >=7) {
00490                                 bl = 0; */
00491         } else {
00492                 bl = 7 - (nbits % 8);
00493         }
00494         //clog << "OJO Bits binarios ya extraidos bl=" << bl << endl;
00495         unsigned int  ui = 0;
00496         //ss <<  (char)B8(11111001);
00497         //ss <<  (char)B8(00000000);
00498         ui = (unsigned char)(c << ((nbits % 8) + 1)); // Quitamos lo que quedaba de unario en c  0...11000000
00499         //clog << "OJO ui tras quitar unario corriendo es " << ui << " = " << ulong2ascii(ui, 32) << endl;
00500         if (bl == nbits) {
00501                 //clog << "OJO cupo en un byte" << endl;
00502                 ui >>= 8 - bl;                           // Y dejamos lo que quede de binario en parte baja de ui 0...00000011
00503         } else {
00504                 //clog << "No cupo en un byte" << endl;
00505                 ui >>= (nbits % 8) + 1;
00506         }
00507 
00508         //clog << "OJO ui con lo que quedaba de binario es " << ui << " = " << ulong2ascii(ui, 32) << endl;
00509         while (bl < nbits) {
00510                 c = is.get();
00511                 //clog << "OJO en tercer ciclo bl = " << bl << ", c=" << c << "=" << ulong2ascii(c, 8) << endl;
00512                 if ((nbits > 8) && (bl < nbits - 8)) {
00513                         // Quedarán más
00514                         ui <<= 8;
00515                         ui |= c;
00516                         bl += 8;
00517                         //clog << "OJO quedarán más ui = " << ui << ", bl=" << bl << endl;
00518                 } else {
00519                         // Ultimo byte puede no estar totalmente lleno
00520                         ui <<= nbits - bl;
00521                         unsigned char cui = ((unsigned char)c) >> 8 - nbits + bl;
00522                         //clog << "OJO último nbits=" << nbits << ", bl=" << bl << ", nbits-bl=" << nbits-bl << ", cui=" << (unsigned int)cui << " = " << ulong2ascii(cui, 8) << endl;
00523                         ui |= cui;
00524                         bl = nbits;
00525                         //clog << "OJO último ui=" << ui << endl;
00526                 }
00527         }
00528 
00529         unsigned int lr = p2f | ui;
00530         //clog << "OJO lr = " << lr << endl;
00531         return lr;
00532 }
00533 
00540 void
00541 escribe_elias_gama(std::ostream &os, unsigned int n)
00542 {
00543         ASSERT(n >= 1);
00544 
00545         //clog << "escribe_elias_gama(os, " << n << ")" << endl;
00546         vector<bool> vb(0);
00547         codifica_elias_gama(n, vb);
00548         //clog << "codificado es '" << vb2str(vb) << "'" << endl;
00549         unsigned int i, p2 = 128;
00550         unsigned char c = 0;
00551         //clog << "vb.size=" << vb.size() << endl;
00552         unsigned int t = vb.size();
00553         for(i = 0; i < t; i++) {
00554                 if (vb[i]) {
00555                         c = c | p2;
00556                 }
00557                 //clog << "i=" << i << ", p2=" << p2 << ", vb[i]= " << vb[i] << ", c=" << c << endl;
00558                 p2 >>= 1;
00559                 if (p2 == 0) {
00560                         os << c ; //os.write((char *)&c, 1);
00561                         //clog << "Poniendo " << (unsigned int)c << ", sizeof(c)=" << sizeof(c) << endl;
00562                         p2 = 128;
00563                         c = 0;
00564                 }
00565         }
00566         if (p2 != 128) {
00567                 //clog << "typide(os)=" << typeid(os).name() << endl;
00568                 os << c ; //os.write((char *)&c, 1);
00569                 //clog << "Poniendo " << (unsigned int)c << endl;
00570         }
00571 }
00572 
00573 
00574 void
00575 escribe_elias_gama2(std::ostream &os, unsigned int n)
00576 {
00577         ASSERT(n >= 1);
00578 
00579         unsigned long r = 0;
00580         //clog << "OJO escribe_elias_gama2(os, " << n << ")" << endl;
00581         int b = piso_logb2(n);
00582         //clog << "OJO b=" << b << endl;
00583 
00584         ASSERT(b <= 31);
00585         //clog << "OJO codifica_unario(b)" << endl;
00586         for (int i = 0; i < b; i++) {
00587                 r |= 1;
00588                 r <<= 1;
00589                 //clog << "OJO final de ciclo i=" << i << ", r=" << r << endl;
00590         }
00591         r <<= b;
00592         //clog << "OJO tras corrimient r=" << r << "=" << ulong2ascii(r) << endl;
00593 
00594         //clog << "pone_un_entero(x - pot2(b - 1), b - 1)" << endl;
00595         unsigned long m = 0;
00596         for (int i = 0; i < b; i++) {
00597                 m <<= 1;
00598                 m |= 1;
00599         }
00600         //clog << "OJO mascara m=" << m << "=" << ulong2ascii(m) << endl;
00601         r |= n & m;
00602         //clog << "n & m = " << (n & m) << ", r=" << r << "=" << ulong2ascii(r) << endl;
00603 
00604         int nb = 1+b/4;
00605         r <<= (nb*8) - (2*b + 1);
00606         //clog << "OJO nb=" << nb << " bytes r=" << r << "=" << ulong2ascii(r) << endl;
00607         m = (unsigned long)0xFF00000000000000;
00608         unsigned char c = 0;
00609         for (int i=0; i < 8; i++) {
00610                 if (8-i <= nb) {
00611                         unsigned long ct = (unsigned long)r & (unsigned long)m;
00612                         //clog << " OJO en ciclo final i=" << i << ", ct1=0x" << setbase(16) << (unsigned long)ct << setbase(10) << endl;
00613                         ct >>= 8*(7-i);
00614                         //clog << " OJO en ciclo final i=" << i << ", ct2=0x" << setbase(16) << (unsigned long)ct << setbase(10) << endl;
00615                         c = (unsigned char)ct;
00616                         //clog << " OJO en ciclo final i=" << i << ", c=" <<  ulong2ascii(c, 8) << ", ct=0x" << setbase(16) << (unsigned long)ct << ", r=0x" << r << ", m=0x" << m << setbase(10) << "=" << ulong2ascii(m, 64) << endl;
00617                         os.write((char *)&c, 1);
00618                         //clog << " OJO escrito " << (unsigned int)*((char *)&c) << endl;
00619                 } else {
00620                         //clog << " OJO en ciclo final i=" << i << ", m=" << setbase(16) << m << setbase(10) << " = " << ulong2ascii((unsigned long)m, 64) << endl;
00621                 }
00622                 m >>= 8;
00623         }
00624 
00625         /*
00626                 if (b<=3) { // 1 byte
00627                         r <<= 8 - (2*b + 1);
00628                         clog << "1 byte r=" << r << " p[4]=" << (int)p[4] << endl;
00629                         os.write(p+7, 1);
00630                 } else if (b<=7) { // 2 bytes
00631                         r <<= 16 - (2*b + 1);
00632                         clog << "2 bytes r=" << r << "p[3]=" << (int)p[3] << ", p[4]=" << (int)p[4] << endl;
00633                         os.write(p+6, 2);
00634                 } else if (b<=11) { // 3 bytes
00635                         r <<= 24 - (2*b + 1);
00636                         clog << "3 bytes r=" << r << "p[2]=" << (int)p[2] << ", p[3]=" << (int)p[3] << ", p[4]=" << (int)p[4] << endl;
00637                         os.write(p+1, 3);
00638                 } */
00639 
00640 }
00641 
00642 
00643 
00651 unsigned int
00652 long_elias_gama(unsigned long n)
00653 {
00654         ASSERT(n >= 1);
00655 
00656         int b = 1 + piso_logb2(n);
00657         int nb = (b-1)*2 + 1;
00658 
00659         return (unsigned long)ceil((double)nb/(double)8);
00660 }
00661 
00662 
00663 void codifica_binaria_minima(unsigned long x, unsigned int n, vector<bool> &vb)
00664 {
00665         ASSERT(x >= 0);
00666         ASSERT(n >= 1);
00667 
00668         int b = techo_logb2(n);
00669         unsigned long d = pot2(b) - n;
00670         if (x > d) {
00671                 pone_un_entero(x - 1 + d, b, vb);
00672         } else {
00673                 pone_un_entero(x - 1 , b - 1, vb);
00674         }
00675 }
00676 
00677 
00678 unsigned long decodifica_binaria_minima(unsigned int n, vector<bool> &vb)
00679 {
00680         ASSERT(n >= 1);
00681 
00682         //clog << "decodifica_binaria_minima(" << n << ", vb)" << endl;
00683         unsigned int b = techo_logb2(n);
00684 
00685         ASSERT(vb.size() >= b - 1);
00686 
00687         long d = pot2(b) - n;
00688         long x = toma_un_entero(b - 1, vb);
00689         if ((x + 1) > d) {
00690                 vector<bool>::iterator cv = vb.begin();
00691                 char c = *cv;
00692                 vb.erase(cv);
00693                 x = 2 * x + c;
00694                 x = x - d;
00695         }
00696         return x + 1;
00697 }

Generado el Wed Jan 6 06:58:21 2010 para Mt77 por  doxygen 1.5.4