Problema con el uso de corrimientos de bits (bitshift)

Iniciado por icoheed, 5 Mayo 2012, 08:23 AM

0 Miembros y 2 Visitantes están viendo este tema.

icoheed

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:


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


Ojalá me puedan ayudar un poco. Muchas gracias.

Eternal Idol

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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón


icoheed

Ya chequé y el tamaño de unsigned long me lo da como 8.

Alguna sugeencia?????

x64core

entonces seguramente tu maquina es de x64, si necesitas el 0x40000000 entonces el power debería sér 30d

Eternal Idol

Para verlo:
printf("Prueba: %I64x", auxtab);

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


O asi:
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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

icoheed

Cita de: Eternal Idol en 10 Mayo 2012, 10:17 AM
Para verlo:
printf("Prueba: %I64x", auxtab);

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


O asi:
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?

Eternal Idol

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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

icoheed

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.

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón