Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Trabajar a nivel de bit en c++

Iniciado por shephiroth, 28 de Noviembre de 2006, 08:00:27 PM

« anterior - próximo »

shephiroth

Pues eso, que estoy trabajando con lo de las comparaciones, y hasta el momento estoy trabajando con char y array de 8 booleanos.....operando en un entorno pequeño este sistema puede resultar comodo y no demasiado lento.....pero de cara a usarlo en un entorno mas grande y donde cada ciclo de reloj cuenta, el operar a nivel de bit podría dar mayor velocidad al codigo.

Por si alguien lo pregunta, un struct de 8 booleanos tb me lo cuenta como 8 bytes >_<

GRACIAS ^_^

AK47

Puedes usar el std::vector<bool> que es una especialización para trabajar con bits. Y sino también hay formas de asignar un número de bits a cada elemento de una estructura, creo... Bajate los thinking in C++ vol 1 y 2, que el autor los ha puesto para ello en su web. Creo que comenta estas historias :)

MrK

me parece que se usaban los 2 puntos para definir bits:

typedef struct
{
   int bit0:1;
   int bit1:1;
   int bit2:1;
   int bit3a7:5;
} lala;

esto seria 1 solo byte, con bit0,1 y 2 ocupando 1 bit, y el otro ocupando 5 bits. Otra cosa sera el padding

sino siempre puedes crearte una clase y usar una funcion de acceso y escritura (readBit, setBit), donde en ella se acceda a un array de enteros y hagas el acceso al array y el shift correspondiente al bit al que quieres acceder (si has haces inline no tendrian que ser lentas)

Sante

Cita de: "shephiroth"Pues eso, que estoy trabajando con lo de las comparaciones, y hasta el momento estoy trabajando con char y array de 8 booleanos.....operando en un entorno pequeño este sistema puede resultar comodo y no demasiado lento.....pero de cara a usarlo en un entorno mas grande y donde cada ciclo de reloj cuenta, el operar a nivel de bit podría dar mayor velocidad al codigo.

Por si alguien lo pregunta, un struct de 8 booleanos tb me lo cuenta como 8 bytes >_<

GRACIAS ^_^

No estoy muy seguro de que es lo que pides exactamente, pero si lo que intentas es trabajar con variables de tamaño bit, olvidate, porque no se puede. El tamaño minimo es de 1 byte.

Si quieres usar bits para guardar valores true o false, vas a tener que usar una variable de 1 o más bytes, y manipular sus bits a través de máscaras, ands, ors, desplazamientos, etc...

Por ejemplo, un entero son 32 bits, por lo que te daría para guardar lo mismo que con 32 booleanos. Para acceder al valor del bit n harías esto:


int vector;

bool valorBit = (vector & (1<<n))!=0;


Lo que hago es crear una máscara que tenga el bit n a 1 y los demás a cero, hacer el and con el vector, y guardar el resultado en el booleano. A partir de ahí ya se puede operar con el normalmente.

Para guardar, sería algo parecido pero con or:


vector = vector | ((valorBit?1:0)<<n);


Y si quisieras mas de 32 bits, tendrías que usar más enteros.

Esto te ahorra mucha memoria, pero si lo que te importa es la velocidad de acceso, entonces mejor que sigas usando los bool de toda la vida, porque para leer (desempaquetar) el valor de un bit como ves hacen falta al menos 3 operaciones, mientras que el de un booleano ya lo tienes preparado para operar en cuanto lo traes de memoria.

El único caso donde esto es más rentable es si vas a operar "vectorialmente". Por ejemplo, hacer el and de todos los valores de un vector con los de otro. De esta forma si que puedes ahorrar tiempo.

Un saludo!

PD: Cambia eso de "vit" por favor :P

shephiroth

Mil perdones por el error, se me fue el dedo  :oops:  :oops:  :oops:  :oops:  :oops:  :oops:

Bueno, siento tardar tanto, pero estuve con el compilador para ver que tal iva. Lo primero agradecer a todos, sobretodo a Mrk, pues su estructura rula genial.

He utilizado el GetTickCount para las pruebas, pero mientras el codigo anterior tardaba 1656, el nuevo codigo lo hace en la mitad de tiempo 828....tambien aclarar que para las pruebas son unas 2millones de evaluaciones :D

GRACIAS ^^






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.