Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: icoheed en 5 Mayo 2012, 08:23 am



Título: Problema con el uso de corrimientos de bits (bitshift)
Publicado por: icoheed en 5 Mayo 2012, 08:23 am
Hola a todos, estamos desarrollando un motor de ajedrez en el cual para hacer los movimientos de las piezas usamos corrimientos de bits o bitshifts. El problema es que cuando se hace el computo de 1<<38, este arroja como resultado 0x40 debiendo ser 0x4000000000. El segmento de código es el siguiente:


Código:
int power=38;
     unsigned long auxtab=0;
   
   auxtab=(1<<power);
   printf("Prueba: %x",auxtab);
   

Ojalá me puedan ayudar un poco. Muchas gracias.


Título: Re: Problema con el uso de corrimientos de bits (bitshift)
Publicado por: Eternal Idol en 5 Mayo 2012, 10:34 am
sizeof(unsigned long) es 4. ¿No? El valor maximo que podes asignarle es 0xFFFFFFFF asi que si queres ese valor que pusiste tenes que usar una variable de mayor tamaño, fijate en tu compilador.


Título: Re: Problema con el uso de corrimientos de bits (bitshift)
Publicado por: david_BS en 5 Mayo 2012, 20:11 pm
http://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.80).aspx

si se usa unsigned long long que le sigue a unsigned long




Título: Re: Problema con el uso de corrimientos de bits (bitshift)
Publicado por: icoheed en 10 Mayo 2012, 01:15 am
Ya chequé y el tamaño de unsigned long me lo da como 8.

Alguna sugeencia?????


Título: Re: Problema con el uso de corrimientos de bits (bitshift)
Publicado por: x64core en 10 Mayo 2012, 03:55 am
entonces seguramente tu maquina es de x64, si necesitas el 0x40000000 entonces el power debería sér 30d


Título: Re: Problema con el uso de corrimientos de bits (bitshift)
Publicado por: Eternal Idol en 10 Mayo 2012, 10:17 am
Para verlo:
Código:
printf("Prueba: %I64x", auxtab);

Y lo podes calcular asi:
Código:
unsigned long long auxtab = 1;
auxtab <<= power;

O asi:
Código:
auxtab=((unsigned long long)1 << power);

PD. Puede que no necesites hacer el casting ni cambiar el tipo segun lo que comentas del tamaño de la variable, con lo del printf estaria solucionado.


Título: Re: Problema con el uso de corrimientos de bits (bitshift)
Publicado por: icoheed en 14 Mayo 2012, 00:49 am
Para verlo:
Código:
printf("Prueba: %I64x", auxtab);

Y lo podes calcular asi:
Código:
unsigned long long auxtab = 1;
auxtab <<= power;

O asi:
Código:
auxtab=((unsigned long long)1 << power);

PD. Puede que no necesites hacer el casting ni cambiar el tipo segun lo que comentas del tamaño de la variable, con lo del printf estaria solucionado.

El problema no es la impresión en pantalla del número hexadecimal, el problema radica en que el cálculo se está haciendo mal. Pasamos ese número hexadecimal a una función que imprime un tablero gráfico y el número está mal.

Ya hemos probado diferentes posibles soluciones pero no obtenemos que haga el cálculo correctamente, nos corta a 32 bits siendo que usamos el SO de 64 bits y además el compilador es gcc de 64 bits.

¿Alguna idea?


Título: Re: Problema con el uso de corrimientos de bits (bitshift)
Publicado por: Eternal Idol en 14 Mayo 2012, 09:50 am
Bien, pero nunca lo iban a ver como corresponde con %X. Proba de calcularlo como motsre arriba y si sigue sin funcionar depura el programa para ver exactamente que esta haciendo.


PD. Vos estabas usando 1 y ese literal es un int, ponelo en una variable de 64 bits o hacele un casting al empujar.


Título: Re: Problema con el uso de corrimientos de bits (bitshift)
Publicado por: icoheed en 22 Mayo 2012, 02:04 am
Muchas gracias, es cierto, el problema es que estaba corriendo una variable de 32 bits por lo cual la cortaba en 32 bits. Ahora he usado el mismo auxtab igualado a 1 el cual es unsigned long en 64 bits.

El problema ha sido solucionado, pueden dar el tema por SOLUCIONADO. Muchas gracias a todos por sus respuestas.


Título: Re: Problema con el uso de corrimientos de bits (bitshift)
Publicado por: Eternal Idol en 22 Mayo 2012, 10:06 am
De nadas  ::)