Operadores de desplazamiento de bits

Started by Drumpi, October 25, 2010, 11:33:15 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Pregunta rápida:

¿Los operadores >> y << son lógicos o aritméticos? lo digo porque en la wiki no dice nada sobre esto y estoy notando cosas raras cuando los uso para hacer divisiones por potencias de 2. ¿">>" divide realmente, aunque el número sea negativo, o es recomendable usar el operador "/" ?

(lo de las "cosas raras" aun estoy rastreando el origen del error, ya pondré el código si no lo soluciono)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

ni una cosa ni la otra.

son operadores bitwise, concretamente de rotacion.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Quote from: SplinterGU on October 26, 2010, 12:48:57 AM
ni una cosa ni la otra.

son operadores bitwise, concretamente de rotacion.

Más eficientes por ende que la división, ¿No?

De eso se trata xD
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Sí, pero he comprobado que da problemas en la "división". Tengo que hacer pruebas exahustivas para saber por qué, pero creo que no se lleva bien con números negativos, porque a la izquierda no añade bit de signo, sino ceros... o el bit de la derecha, no sé seguro, pero he cambiado los >> por / y ya me va bien (ahora el error está por otro lado).

En cuanto acabe el juego, a ver si puedo optimizar usando de nuevo >>.
No estoy al tanto de si existen divisores por HW, que hagan la división en 1 ciclo, como hacen los sumadores, restadores y multiplicadores, los que yo conozco requieren de varios ciclos mediante prueba y error.

>> sólo precisa un ciclo sin HW específico, pero exisen de diversos tipos:

-Lógicos: eliminan un bit y añaden un cero por el otro extremo.
-Aritméticos: eliminan un bit y añaden otro, ceros por la derecha, y el bit de signo por la izquierda.
-Shift barrel: el dato que sacan lo introducen por el otro extremo.

He ahí mi duda.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

drumpi, no es division es rotacion.

se puede usar para dividir por 2 (4,8,16,...) en los casos de numeros enteros positivos, pero no es division es rotacion.

no, aritmeticos no son operaciones con bits, son operaciones aritmeticas.

estas mezclando las cosas.

yo te diria que si no sabes lo que estas haciendo, no lo hagas.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Teniendo en cuenta que son operaciones binarias hay que saber como funciona el complemento a 2 para saber qué es lo que se puede y lo que no se puede hacer, especialmente con eso que dice de los números negativos, pero Drumpi imagino que ya controla cómo va eso, ¿No?
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

Quote from: Windgate on October 26, 2010, 09:22:51 PM
Teniendo en cuenta que son operaciones binarias hay que saber como funciona el complemento a 2 para saber qué es lo que se puede y lo que no se puede hacer, especialmente con eso que dice de los números negativos, pero Drumpi imagino que ya controla cómo va eso, ¿No?

evidentemente no lo controla.

por eso es mejor dejar esas cosas para uso avanzado del lenguaje y no complicarse ahora con cosas que no se entienden.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Sí, sí que lo controlo, me he tenido que partir los cuernos con operadores de desplazamiento en ASM del DSP TMS320C32 (y por poco del C64), ya que existen esas tres y para tres tipos de datos distintos (y eso sólo en los comandos básicos).
Y también a nivel HW, por si queda alguna duda ;)

Otra cosa es que en lenguajes de más alto nivel se tome por defecto uno de los tipos y se le llame "desplazamiento" a secas, y ahí es donde entra mi confusión ;)
Si dices que es sólo para enteros positivos, queda claro que se trata de un desplazamiento lógico sin realimentación, por lo que, en este caso, no sirven para mi propósito de división (ni para optimizar el motor de tiles), pero sí para multiplicar (aunque como digo, existiendo HW multiplicador, carece de sentido).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

no debi usar la palabra rotacion, realmente son desplazamientos.

las rotaciones implican que el bit que desaparece de un lado aparezca por el otro, o en algunos casos (segun el tipo de rotacion) pasen al bit de acarreo y el valor de este ingrese por el lado donde se ingresan los nuevos bits.

por otro lado, esto son desplazamientos de bits (NO SON LOGICOS) exactamente igual a como estan en C, y en ASM tambien, ya que no todos los desplazamients de ASM mantienen el bit de signo, concretamente estos operadores son los equivalente en asm a SHL y SHR, que sirven para multiplicar y dividir correctamente valores sin signo, enteros obviamente.

Los que mantienen el signo son en ASM SAL y SAR, pero estos no estan soportados ni en C ni en BennuGD.

* las instrucciones de ASM mencionadas son de x86, todos (o casi) los procesadores tienen estos tipos de desplazamientos, aunque no en todos se llaman igual.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

No pienso discutírtelo porque sé que llevas razón, pero estarás conmigo que la duda tiene su por qué ;D

Pero los desplazamientos que mantienen el signo son los aritméticos (porque entienden la sucesión de bits como un número, y mantienen su forma positiva o negativa), y los que no son los lógicos (porque sólo ven una sucesión de 1 y 0, sin ningún tipo de interpretación), o al menos, así recuerdo haberlo estudiado (no me hagas repasármelo otra vez ^^U)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

Quote from: Drumpi on October 30, 2010, 03:03:23 AM
No pienso discutírtelo porque sé que llevas razón, pero estarás conmigo que la duda tiene su por qué ;D

Pero los desplazamientos que mantienen el signo son los aritméticos (porque entienden la sucesión de bits como un número, y mantienen su forma positiva o negativa), y los que no son los lógicos (porque sólo ven una sucesión de 1 y 0, sin ningún tipo de interpretación), o al menos, así recuerdo haberlo estudiado (no me hagas repasármelo otra vez ^^U)

digamos que si, esa es la idea.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2