• Jueves 14 de Noviembre de 2024, 04:11

Autor Tema:  archivos de 5 bits de unidad  (Leído 3003 veces)

Alfonsos1

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
archivos de 5 bits de unidad
« en: Domingo 16 de Enero de 2011, 22:12 »
0
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

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: archivos de 5 bits de unidad
« Respuesta #1 en: Domingo 16 de Enero de 2011, 23:11 »
0
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.  

Alfonsos1

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
Re: archivos de 5 bits de unidad
« Respuesta #2 en: Domingo 16 de Enero de 2011, 23:23 »
0
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

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: archivos de 5 bits de unidad
« Respuesta #3 en: Lunes 17 de Enero de 2011, 14:38 »
0
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

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
Re: archivos de 5 bits de unidad
« Respuesta #4 en: Lunes 17 de Enero de 2011, 14:54 »
0
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?

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: archivos de 5 bits de unidad
« Respuesta #5 en: Lunes 17 de Enero de 2011, 16:09 »
0
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.  

Alfonsos1

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
Re: archivos de 5 bits de unidad
« Respuesta #6 en: Lunes 17 de Enero de 2011, 17:31 »
0
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...

LapizTolita

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: archivos de 5 bits de unidad
« Respuesta #7 en: Lunes 17 de Enero de 2011, 18:09 »
0
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.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: archivos de 5 bits de unidad
« Respuesta #8 en: Martes 18 de Enero de 2011, 08:18 »
0
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.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: archivos de 5 bits de unidad
« Respuesta #9 en: Martes 18 de Enero de 2011, 18:22 »
0
Cita de: "LapizTolita"
segun M$ sí.

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

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

LapizTolita

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: archivos de 5 bits de unidad
« Respuesta #10 en: Martes 18 de Enero de 2011, 18:36 »
0
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í.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: archivos de 5 bits de unidad
« Respuesta #11 en: Martes 18 de Enero de 2011, 19:00 »
0
No te hagas el pistola que nos conocemos todos.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.