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)