Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Empaquetar

Iniciado por Omaddon, 30 de Julio de 2003, 10:58:55 PM

« anterior - próximo »

Omaddon

Necesito empaquetar 3 valores de 10 bits(0..1023 codificados como int o short) en una palabra de 4 bytes(int). Como deben ser las operaciones a nivel de bits para solo elegir los 10 bits menos significativos de cada componente y situarlos en el lugar de la palabra de 4 bytes correcto y despues poder leer los valores de la componente desde dicha palabra. Muchas gracias.

tywok

 Hola
a ver.. no es muy dificil... tienes el int a 0, para guardar el primer dato simplemente se lo sumas al int, para guardar el segundo dato y le suma al int (y<<10) y para guardar el tercero le sumas al int (z<<20). para sacarlos es muy facil, lo unico q haces es valor=(valorguardado>>(10*i))%1024; (i = 0..2).
como ves no es muy dificil, un saludo!

ethernet

 Y los acarreos? no sería mejor hacer un or ?
por otra parte no tendría que ser:

valor=(valorguardado>>(10*i))%1024;  --- > valor=(valorguardado>>(10*i))%0x03ff; ?

saludos

Omaddon

 Funciona bien si solo introduzco datos una vez. Si una vez empaquetado, necesito sobreescribir el valor de uno de los componente, da un resultado incorrecto.

tywok

 a ver... para introducir otro dato despues de haber guardado uno antes lo q tienes q hacer es sacarlo, es decir, restar y dejar los 10 bits a 0 para q cuando añadas otro valor se te guarde correctamente....

void ponvalor(int indice, int valor){
int antiguovalor=(valorguardado>>(10*i))%1024;
valorguardado-=antiguovalor<<(10*i);
valorguardado+=valor<<(10*i);
}
eso deberia funcionar, corregirme si me equivoco...

PD: ethernet, pq haces modulo 1023??un valor de 10 bits va de 0 a 1023, pero un modulo de 1023 va solamente hasta el 1022, asiq daria fallo en el caso de q el valor fuese 1023, x lo q el 1024 esta bien

un saludo y omaddon, dime si funciona cuando lo leas
tywok

Mars Attacks

 En vez de los desplazamientos yo usaría máscaras y ors para la escritura y ands para poner a 0 la parte que luego quieras reescribir con un or, tal como dice ethy.

tywok

 pero bueno, hacerlo con mascaras es lo mismo q hago yo, pero desde otro punto de vista... no creo q vaya mas rapido ni nada, aunque bueno, vosotros sabreis, ya q sabeis mas q yo...
un saludo

Mars Attacks

 Creo que los desplazamientos están al mismo nivel de velocidad que un or o un and, son funciones básicas. Y si no, en cualquier caso tendrán tiempos parecidísimos, no notarías las diferencia.

La máscara para los 10 bits más significativos sería un & 0x000003FF si no me he equivocado.

Juan Mellado

 
int Get(int v, int i)   //i = [0, 1, 2]
{
   return( (v >> (10 * i) ) & 0x3FF);
}

void Set(int & v, int i, int s)   //s = valor a poner
{
   int m[] = {0x3FFFFC00, 0x3FF003FF, 0x000FFFFF};

   v = (v & m[i]) | (s << (10 * i) );
}

Mars Attacks

 Juer, qué friki  :blink:  

Omaddon

 Ya funciona. Gracias a todos por vuestras respuestas.

tywok

 
CitarLa máscara para los 10 bits más significativos sería un & 0x000003FF si no me he equivocado.

bueno, pues para la mascara si, pq en binario es diez unos seguidos, pero si lo haces en modulo, tienes q poner el siguiente, osea, el 1024. las dos cosas estan bien (ole)

PD: omaddon, al final como lo hiciste, x simple curiosidad??

un saludo

ethernet

Cita de: "tywok"
PD: ethernet, pq haces modulo 1023??un valor de 10 bits va de 0 a 1023, pero un modulo de 1023 va solamente hasta el 1022, asiq daria fallo en el caso de q el valor fuese 1023, x lo q el 1024 esta bien
Perdon, me confundí, quise poner un &  ;).  

Omaddon

 El código de Juan Mellado funciona bien.

int Get(int v, int i)   //i = [0, 1, 2]
{
  return( (v >> (10 * i) ) & 0x3FF);
}


void Set(int & v, int i, int s)   //s = valor a poner
{
  int m[] = {0x3FFFFC00, 0x3FF003FF, 0x000FFFFF};

  v = (v & m) | (s << (10 * i) );
}


Lo único, es que he añadido una comprobación para evitar que en la función Set, introduzcan un valor suparior a 10bits, porque si lo hacen modificarias también la componente superior.

Mars Attacks

 Juan Mellado rocks  (ole)  (ole)  (ole)  






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.