Programación General > C/C++
archivos de 5 bits de unidad
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
[#] Página Siguiente
Ir a la versión completa