SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: kain en Sábado 22 de Febrero de 2003, 20:19

Título: Re: Desplazamiento de mascara de permisos
Publicado por: kain en Sábado 22 de Febrero de 2003, 20:19
Mi problema es el siguiente... Desea hacer un desplazamiento aritmetico a izquierdas ya que tengo una mascara de bits de permisos. La mascara de bits la declaro como un signed int y lo que deseo hacer es desplazar el bit correspondiente de la mascara para que se quede a 1 y que por lo tanto como estan representados  y complemento a dos pues sea negativo el numero...
bueno pues cuando intento hacer esto como el rango de representacion de un signed int es de -32768 a 32768 ,realizo 16 desplazamientos suponiendo de que el bit este totalmente a la derecha... pues nada... el numero sigue siendo positivo. Tengo que hacer 28 desplazamientos para que cambie de signo y se me sube el numero en un par de milloncejos...

Mi pregunta es esto normal? Como se puede hacer para que el entero al desplazarlo quede en el rango anterior ???

Salu2
Título: Re: Desplazamiento de mascara de permisos
Publicado por: gmantil en Lunes 24 de Febrero de 2003, 13:58
He hecho una prueba con el programita que adjunto y a mi me funciona. Pruebelo en su compilador. En el movimiento 15 el número se convierte en negativo.

# include <stdio.h>

main()
{
   int i,num=1;

   for(i=0; i<15; i++)
   {
      printf("n %d ",num<<=1);
   }
}

Suerte,
gmantil
Título: Re: Desplazamiento de mascara de permisos
Publicado por: kain en Miércoles 26 de Febrero de 2003, 21:37
Intenta hacer 30 desplazamientos en vez de 15 desplazamientos... a mi no me cambia de un valor positivo a negativo que es lo que busco... tal vez sea del compilador de linux... pero no estoy seguro.

Salu2
Título: Desplazamiento de mascara de permisos
Publicado por: gmantil en Jueves 27 de Febrero de 2003, 13:47
Verifica que efectivamente tu palabra es de 16 bit. Puede ser que tu palabra sea de 32 bit lo cual hará que el rango no sea entre -32768 y 32768. Me pones a pensar en esto cuando me dices que con tu desplazamineto en 28 sube algunos "milloncejos". Asigna a tu variable 0xFFFF e imprime la variable. No he probado lo que te digo en Linux pero me parece que la palabra allí es de 32 bits.

Seguimos en contacto, si descubro algo te lo haré saber.

Suerte,

gmantil