• Domingo 22 de Diciembre de 2024, 22:15

Autor Tema:  Almacenar en un long dos int  (Leído 1075 veces)

aisbel

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Almacenar en un long dos int
« en: Viernes 8 de Mayo de 2009, 18:11 »
0
Hola a todos,

tengo una duda que no consigo resolver, a ver si me pueden ayudar:

Tengo las siguientes variables:

int x;
int y;
long coordenadas;

Me gustaría, ya que los enteros ocupan 2B y los long 4B, almacenar el primer entero (x) en los primeros 2B del long, y el segundo entero (y) en los 2B de más peso del long.

He probado varias formas, lo que intento hacer es algo así:

coordenadas= 0xFFFF0000L & x;
coordenadas= coordenadas & (y<<32);


Gracias de antemano :))

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Almacenar en un long dos int
« Respuesta #1 en: Viernes 8 de Mayo de 2009, 18:56 »
0
En una PC (32/64 bits) int y long son 4 bytes, short son 2 bytes.

coordenadas = (y << 16) | x;

Despues para sacar x e y de coordenadas:
x = coordenadas & 0x0000FFFF;
y = coordenadas >> 16;

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.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Almacenar en un long dos int
« Respuesta #2 en: Viernes 8 de Mayo de 2009, 19:00 »
0
Primero, deberías asegurarte que realmente los tipos tienen ese tamaño en bytes, para ello utiliza sizeof:
Código: C
  1. printf( "sizeof(int): %d bytesn", sizeof( int ) );
  2. printf( "sizeof(long): %d bytesn", sizeof( long ) );
  3.  
Al menos en mi equipo, ambos tienen el mismo tamaño (4 bytes).

De cualquier forma, sería solo un dato aclaratorio. Si x y y son de 4 bytes pero tú te asegurarás que no tendrás valores mayores a los que se pueden almacenar en 2 bytes:

Código: C
  1.     int x = 1;
  2.     int y = 2;
  3.  
  4.     long coord = 0;
  5.  
  6.     coord  = ( ( x & 0x0000ffff ) << 16 ) | ( y & 0x0000ffff );
  7.  
-------------------
Edición:
Jeje, Eternal me ganó en enviar la respuesta :P.
La imaginación es el límite.
Hardware & Software | Mexchip