SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Alfonsos1 en Domingo 16 de Enero de 2011, 22:12

Título: archivos de 5 bits de unidad
Publicado por: Alfonsos1 en Domingo 16 de Enero de 2011, 22:12
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?
Título: Re: archivos de 5 bits de unidad
Publicado por: LapizTolita en Domingo 16 de Enero de 2011, 23:11
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++
  1. #include <iostream>
  2. #define REP(k,a) for(int k=0; k < (a); ++k)
  3. struct ConjuntoBits
  4. {
  5. private:
  6.     int bits;
  7. public:
  8.     ConjuntoBits()
  9.     {
  10.         bits = 0;
  11.     }
  12.     bool Contiene(int item)
  13.     {
  14.         return (bits & (1 << item)) != 0;
  15.     }
  16.     void Agregar(int item)
  17.     {
  18.         bits=(bits | (1 << item));
  19.     }
  20.     void Remover(int item)
  21.     {
  22.         bits=(bits & ~(1 << item));
  23.     }
  24.    void Mostrar()
  25.    {
  26.        REP(item,32)
  27.            if (Contiene(item))
  28.                std::cout << item << " ";
  29.        std::cout << std::endl;
  30.    }
  31.    int Cantidad()
  32.    {
  33.        int restante = bits;
  34.        int Cantidad = 0;
  35.        while (restante != 0)
  36.        {
  37.            restante &= (restante - 1);
  38.            Cantidad++;
  39.        }
  40.        return Cantidad;
  41.    }
  42. };
  43. int _tmain(int argc, _TCHAR* argv[])
  44. {
  45.     ConjuntoBits algo;
  46.     REP(i,5)
  47.         algo.Agregar(i*5);
  48.     if(algo.Contiene(5))
  49.         std::cout << "si" << std::endl;
  50.     else
  51.         std::cout << "no" << std::endl;
  52.     algo.Mostrar();
  53.     std::cout << algo.Cantidad() << std::endl;
  54.     algo.Remover(5);
  55.     if(algo.Contiene(5))
  56.         std::cout << "si" << std::endl;
  57.     else
  58.         std::cout << "no" << std::endl;
  59.     algo.Mostrar();
  60.     std::cout << algo.Cantidad() << std::endl;
  61.     std::cin.get();
  62.     return 0;
  63. }
  64.  
  65.  
Título: Re: archivos de 5 bits de unidad
Publicado por: Alfonsos1 en Domingo 16 de Enero de 2011, 23:23
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
Título: Re: archivos de 5 bits de unidad
Publicado por: m0skit0 en Lunes 17 de Enero de 2011, 14:38
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).
Título: Re: archivos de 5 bits de unidad
Publicado por: Alfonsos1 en Lunes 17 de Enero de 2011, 14:54
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?
Título: Re: archivos de 5 bits de unidad
Publicado por: m0skit0 en Lunes 17 de Enero de 2011, 16:09
Cita de: "Alfonsos1"
talves coloque 8 datos en 5 bytes para no desperdiciar nada.
Ahí pierdes velocidad, ya que como te dije, la máquina curra mucho mejor con 4 bytes que cualquier otro tamaño de datos.

Cita de: "Alfonsos1"
ya me mencionaron que un int ocupa 32 bits, osea que puede tener valores entre 0 y 4,294,967,295, ¿verdad?
Sí, pero yo me refiero a colocar tus datos de 5 bits por bits, tal que

Código: Text
  1. 32 bits -> XX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX
  2.               DATO6 DATO5 DATO4 DATO3 DATO2 DATO1
  3.  
Título: Re: archivos de 5 bits de unidad
Publicado por: Alfonsos1 en Lunes 17 de Enero de 2011, 17:31
si, entiendo tu idea, y entiendo que trabajar de a 4 bytes el lo mas veloz, pero la velocidad no me importa tanto.

si un int tiene 4 bytes, ¿como espesifico que una variable tenga mas de 4 bytes (por ejemplo 8)?, en internet vi que un int almacena lo mismo que un long int...
Título: Re: archivos de 5 bits de unidad
Publicado por: LapizTolita en Lunes 17 de Enero de 2011, 18:09
Cita de: "Alfonsos1"
si, entiendo tu idea, y entiendo que trabajar de a 4 bytes el lo mas veloz, pero la velocidad no me importa tanto.

¿Como que la velocidad no te importa?, por ahi si explicas bien que estas haciendo te podemos dar un consejo.

Cita de: "Alfonsos1"
si un int tiene 4 bytes, ¿como espesifico que una variable tenga mas de 4 bytes (por ejemplo 8)?,

¡Creando un TAD? ya sea un struct ,union, class lo que mas te satisfaga.

Cita de: "Alfonsos1"
en internet vi que un int almacena lo mismo que un long int...
segun M$ sí.

m0skito si mirás mi post, decime que tan diferente es lo que vos propones.
Título: Re: archivos de 5 bits de unidad
Publicado por: m0skit0 en Martes 18 de Enero de 2011, 08:18
Cita de: "Alfonsos1"
i un int tiene 4 bytes, ¿como espesifico que una variable tenga mas de 4 bytes (por ejemplo 8)?
Para 8 long long int, aunque ten en cuenta que en C el estándar no especifica qué tamaño debe tener cada tipo, así que ojo.

@LapizTolita: él no quiere manejar un dato de 32 bits, sino varios de 5.
Título: Re: archivos de 5 bits de unidad
Publicado por: Eternal Idol en Martes 18 de Enero de 2011, 18:22
Cita de: "LapizTolita"
segun M$ sí.

Antes de criticar hay que informarse bien, lee el standard.
Título: Re: archivos de 5 bits de unidad
Publicado por: LapizTolita en Martes 18 de Enero de 2011, 18:36
Cita de: "Eternal Idol"
Cita de: "LapizTolita"
segun M$ sí.

Antes de criticar hay que informarse bien, lee el standard.

No sabía que escribir M$ era criticar a Microsoft, yo más bien lo tomé como una abreviatura podría haber puesto Ms. Puse eso porque la información que yo tengo es de ahí.
Título: Re: archivos de 5 bits de unidad
Publicado por: Eternal Idol en Martes 18 de Enero de 2011, 19:00
No te hagas el pistola que nos conocemos todos.