Programación General > C/C++

 archivos de 5 bits de unidad

(1/3) > >>

Alfonsos1:
quiero crear archivos lo mas livianos poslibles (q ocupen poca memoria)

nesesito crear un archivo que almacene valores consecutivos, pero esos valores solo pueden variar entre 0 a 31, por lo que lo mas eficiente seria almacenar un valores cada 5 bites.

por eso quiero ordenar la informacion de a 5 bits en lugar de 8.

en internet solo encuentro funciones para trabajar en modo texto, pero yo nesesitaria hacerlo en modo binario.

Hay funciones que me permitan leer y escrivir los bites de un archivo?

LapizTolita:
Hola Alfonsos1, lo ideal seria que almacenes esos números en 4 bytes dado que son 32 bits y serían del 0 al 31 justo, que mejor que guardar tus números en un entero  :good: .


--- Código: C++ ---#include <iostream> #define REP(k,a) for(int k=0; k < (a); ++k)struct ConjuntoBits {private:    int bits;public:    ConjuntoBits()     {         bits = 0;     }    bool Contiene(int item)    {        return (bits & (1 << item)) != 0;    }    void Agregar(int item)    {        bits=(bits | (1 << item));    }    void Remover(int item)    {        bits=(bits & ~(1 << item));    }   void Mostrar()   {       REP(item,32)           if (Contiene(item))               std::cout << item << " ";       std::cout << std::endl;   }   int Cantidad()   {       int restante = bits;       int Cantidad = 0;       while (restante != 0)       {           restante &= (restante - 1);           Cantidad++;       }       return Cantidad;   }};int _tmain(int argc, _TCHAR* argv[]){    ConjuntoBits algo;    REP(i,5)        algo.Agregar(i*5);    if(algo.Contiene(5))        std::cout << "si" << std::endl;    else        std::cout << "no" << std::endl;    algo.Mostrar();    std::cout << algo.Cantidad() << std::endl;    algo.Remover(5);    if(algo.Contiene(5))        std::cout << "si" << std::endl;    else        std::cout << "no" << std::endl;    algo.Mostrar();    std::cout << algo.Cantidad() << std::endl;    std::cin.get();    return 0;}  

Alfonsos1:
no son 32 bits, son 32 posibilidades distinas, las cuales caben en 5 bits

2^5=32

un integer puede almacenar un numero del 0 al x millones, yo presiso almacenar numeros del 0 al 31

m0skit0:
En realidad puede que pienses que manejar 5 bits es más eficaz que manejar 32 bits, pero esto no es cierto. Las arquitecturas están orientadas para trabajar con 32 bits, y por tanto ése es el mejor tamaño de datos que puedes usar. De todas formas, C/C++ (y la misma arquitectura) sólo permite trabajar con un byte como tamaño más pequeño (porque es el mínimo direccionable por casi todas las máquinas), con lo que malgastarías 3 bits por cada dato.

Si no quieres gastar 3 bits por dato (que tampoco es que sea mucho, ya que para un millón de datos sólo malgastarás menos de 3 MiB), puedes optar por encajar varios datos en cada palabra de 32 bits. Por ejemplo, usa un int (32 bits) y mete 6 datos en él, así sólo malgastarás 2 bits por cada 6 datos, es decir, 1/3 de bit por dato (9 veces mejor que antes). Eso sí, luego el procesar los datos es más complicado (no se puede tener nada gratis).

Alfonsos1:
Me ha gustado tu idea, talves coloque 6 datos en 4 bytes, o talves coloque 8 datos en 5 bytes para no desperdiciar nada.

ya me mencionaron que un int ocupa 32 bits, osea que puede tener valores entre 0 y 4,294,967,295, ¿verdad?

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa