Hola a todos:
¿Raro el título? No, vereis cómo no.
Símplemente quería saber qué era más eficiente, si hacer una división (/) o un desplazamiento de bits (<<) cuando el divisor es una potencia de 2. Supongo que la respuesta es obvia, pero no se si al compilar se hace alguna optimización al respecto y da igual, por lo que queda más claro usar la división en lugar del desplazamiento.
Gracias.
En unas prácticas de arquitectura bastante estúpidas que hice hace un tiempo nos insistieron muchísimo en usar << en lugar de dividir entre 2 por temas de eficiencia, pero me quedé con la misma duda, si el compilador (Era con C en ese caso) era capaz de detectar la mejora y aplicarla :P
Además me hizo mucha gracia que nos hablaran de eficiencia para un programa basado en consola que no hacía más que obtener direcciones de byte, de word, y cosas así a partir de una dirección de memoria en bits :D ni que fuese a saturar un PC xDDD
<< es mas rapido, pero usando desde bennu, hay otras operaciones que se hacen cuando uno hace un / o un <<, asi que habria que ver que cosas se hacen en cada caso a nivel interprete... igualmente creo que sigue siendo mas rapida la rotacion.
jorobi, ahora mismo le estaba metiendo un codigo que si fuera par hiciera una cosa...
usaré contadores, ji ji
Para comprobar si una variable es par:
PRIVATE
int variable;
BEGIN
variable = rand ( 0 , 65536 );
IF ( variable % 2 == 0 )
say ( "La variable es par" );
ELSE
say ( "La variable es impar" );
END
END
El operador % calcula el resto de la división, si el resto al dividir entre 2 es 0, entonces es par, no sé si ya estabas al corriente de ese operador pero es útil para que ciertas cosas sucedan cada X frames y para detectar divisibilidad entre enteros.
Más fácil:
if ((variable & 1) ==1)
//es impar
else
//es par
end
Esto es añadiendo una máscara para comprobar el bit de menor peso (pone el resto a cero salvo ese, que vale lo que valía. Es más rápido que hacer la división y sacar el resto... a menos que pase algo similar a lo que propongo en el principio.
Muchas gracias por las respuestas, al final sólo sabemos que hay ir al código para mirarlo ^^U que bien. En fin, haremos caso a los profes de programación y usaremos las funciones más rápidas aunque no lo sean, lo mismo araño un par de frames en mi motor de tiles.
Wind, ten en cuenta que si no te explican en ese momento las funciones más eficientes ¿cuándo lo hacen? ;D Es buena costumbre optimizar los programas desde el primer momento, así luego no nos sale algo tan lento como Vist... ejem.
Buen aporte Drumpi, nunca he sido amigo de los operadores booleanos y las máscaras de bits, pero la próxima vez que me meta en camisas de 11 varas lo tendré en cuenta, parece muy eficiente, karma++ fíjate tú xD
dentro del gazpacho de lenguajes con los que he ido aprendiendo, estaba el mod o barra invertida \ que servia para que sacara el resto de una división; por consiguiente, si cualquier numero mod 2 == 0 el numero es par...
creo que eso del mod tambien funciona en Bennu...
no lo sé, no lo he probao
En lugar de poner mod pon % que es el mismo operador.
Quizás tengas que importar mod_math, ahora no recuerdo.
Just a quick note: << can do "multiplication", >> does the "division".
Quote from: Sandman on January 11, 2010, 02:33:41 PM
Just a quick note: << can do "multiplication", >> does the "division".
segun puedo ''maltraducir'' dices que << es multipicacion y >> es division...
pero mayor o igual que como es => o >= o da igual...
si, ya se que no tiene nada que ver...
Usando esos operadores la división ignora el resto (Lógicamente) y ojo porque la multiplicación no es exacta, para los impares multiplica por 2 y resta 1.
Sandman: yes, you're right, maybe i was asleep. << and >> follows the writing order of binary numbers (LSB on the right).
Traducción: si, tienes razón, quizás estaba dormido. << y >> siguen el orden de escritura de los números binarios (BMS (bit menos significativo) a la derecha).
Futublog: mayor o igual es >=, en el mismo orden que lo dices.
Windgate: ¿como que para los impares la multiplicación multiplica por dos y resta uno?
3*2=6
011<<1=110
Lo que si podemos tener es problemas (y gordos) con los números negativos, por aquello de emplear el complemento a uno (o a dos, nunca supe cual es el que se usa en los PC).
lol, it is true, multiply has no problems...
With division is integer division, but no more.
Sorry, I was sleepy, drunky or something :P