Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Averiguar Si Tamaño De Textura Es Potencia De 2

Iniciado por fiero, 16 de Agosto de 2003, 03:59:09 AM

« anterior - próximo »

Mars Attacks


fiero

 
Citarfiero,
depende del tipo de la variable sobre la que efectues el desplazamiento. No es lo mismo desplazar un unsigned int que un int a secas.

No se como tenia metido en la cabeza que siempre desplazaba con signo  :huh: , será que nunca lo habia hecho con unsigned. Gracias por el apunte  :)

Da igual que la función se use poco. En ensamblador lo mejor es acostumbrarse a buscar siempre la opción más rápida, para ir cogiendo destreza que en otras partes se va a necesitar.

un saludo
www.videopanoramas.com Videopanoramas 3D player

sés

 
Cita de: "Juan Mellado"
1) funciona si el bit de mayor peso es 1. Prueba IsPowerOfTwo(0x80000000), ya verás como devuelve true.
No lo he probado, pero me extraña, porque ">>" desplaza y mantiene el signo (bit de mayor peso) y no saldría nunca del bucle (n jamás sería 0)

Cita de: "Juan Mellado"
2) 1 si es potencia de 2. Concretamente, 2 ^ 0 (2 elevado a 0).
^_^ Vale, lapsus mental.
Soy indeciso... ¿o no?

sés

 
Cita de: "fiero"...en C no hay desplazamientos lógicos. O sea, en C los desplazamientos son aritméticos, siempre te deja el valor del signo a la izquierda (bit mas significativo). No hay nada que desplace a la derecha, rellenando con '0' los bits más significativos.

Vuelve a mirar mi código: ">>>" es un desplazamiento,  deja ceros a la izquierda.
Soy indeciso... ¿o no?

fiero

 En Visual C++ 6.0, tres '>' dan un error sintáctico. ¿Qué compilador utilizas? Yo no sabia que existia el desplazamiento '>>>'

Edito para poner esto:
http://msdn.microsoft.com/library/default...._.operators.asp
www.videopanoramas.com Videopanoramas 3D player

sés

 Creo que con Borland, pero no me hagas mucho caso, hace mucho que no toco C, ahora estoy con...  (asco)  
Soy indeciso... ¿o no?

DraKKaR

 En C no existe el operador '>>>'. Pero bueno, ya sabeis lo que les gusta inventar cosas a los de borland en sus compiladores.

Juan Mellado

 Sé que no debería, pero ...

Función:

bool IsPowerOfTwo(DWORD n)
{
   _asm{
        mov eax, n
        mov ebx, eax
        dec eax
        js no_PowerOfTwo   //Caso especial: n = 0
        and eax, ebx
        jnz no_PowerOfTwo
       }
        return(true);

   no_PowerOfTwo:
        return(false);
}

Programa de Prueba:

void Test_IsPowerOfTwo()
{
   DWORD i = 0;
   do{
       if ( IsPowerOfTwo(i) ){
            char s[1024];
            sprintf(s, "0x%08x\n", i);
            OutputDebugString(s);
           }
   }while(++i != 0);
}

Salida de la Prueba:

0x00000001
0x00000002
0x00000004
0x00000008
0x00000010
0x00000020
0x00000040
0x00000080
0x00000100
0x00000200
0x00000400
0x00000800
0x00001000
0x00002000
0x00004000
0x00008000
0x00010000
0x00020000
0x00040000
0x00080000
0x00100000
0x00200000
0x00400000
0x00800000
0x01000000
0x02000000
0x04000000
0x08000000
0x10000000
0x20000000
0x40000000
0x80000000

La idea: Las potencias de 2 son los únicos números que no tienen en común ningún bit puesto a uno con el número que le precede. Por lo tanto, el AND entre un número N y N - 1 es 0 sólo si N es una potencia de dos. Caso especial el cero.

Saludos a todos

fiero

 Juan Mellado, sencillamente genial!  (genial)

Además esta forma de averiguar si es potencia me viene como anillo al dedo, ya que yo necesito los valores de N-1 como máscaras para hacer el texture wrap. Lo que hago es almacenar en la máscara N-1 si N es potencia de 2 y 0xFFFFFFFF si no lo es (así el wrap queda desactivado). Y con tu algoritmo queda increiblemente sencillo:


    mov edx,eax            //En eax  TamY y TamX
    sub eax,0x10001
    and edx,eax
    jz potencia2
    mov eax,0xFFFFFFFF
potencia2:
    mov dword ptr[masqwrap],eax


¿Te lo has inventado tú o es cosa de libro?

gracias y un saludo
www.videopanoramas.com Videopanoramas 3D player

Juan Mellado

 
Cita de: "fiero"¿Te lo has inventado tú o es cosa de libro?
Idea mía  B), me di cuenta de esa relación entre N y N-1 haciendo una lista de números en binario. De haberlo copiado de algún sitio hubiera puesto la referencia o el link correspondiente ;).

Me alegra haberte sido de ayuda.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.