Tema: Help!
Ver Mensaje Individual
  #14  
Antiguo 03-06-2003
pplu pplu is offline
Miembro
 
Registrado: jun 2003
Posts: 17
Reputación: 0
pplu Va por buen camino
No creo que desplazar a la derecha sea una variante de dividir... es simplemente desplazar los digitos en base 2, pero por esas casualidades de la vida... estamos dividiendo entre 2. Igual que si en decimal desplazas los digitos a la derecha una posicion: lo que consigues es dividir entre 10

Si lo miramos bien, en el fondo éste bucle esta dividiendo

while Temp > 0 do Temp := Temp - i

si lo escribimos asi (que es equivalente, pero que dá una vuelta menos, que ya de paso seria una optimizacion posible de este bucle)

while Temp > i do Temp := Temp - i

resulta que restamos un numero [i] [x] veces. Y un numero n se puede expresar como n = i x + r . que es una division si lo escribimos asi:

n |__i___
r x (esto pretende ser un esquema de division)

en el algoritmo perdemos x (que es el numero de vueltas que da el bucle), y temp acaba siendo r (que si es 0, hemos encontrado un multiplo), por lo que quieras que no, estas dividiendo de una forma encubierta.

No encuentro ninguna diferencia entre hacer esta operacion y un desplazamiento de bits. Todo es dividir de una forma u otra. ¿estais de acuerdo conmigo?

Otra pequeña optimización que nos ahorraria una vuelta en el bucle seria:

while Temp >= i do Temp := Temp - i;
if Temp = i then enc := true;

Esto nos ahorra una vuelta en caso de que el n sea divisible entre i.

Y aqui llegará la discusión ¿estamos dividiendo, o solo restando / desplazando bits?

Por la misma regla de tres, el (n and 1) tambien es dividir de una forma encubierta.
Solo estamos quitando los bits que son multiplos de 2 dentro del numero n (que son las posiciones 1 a 31 de un numero binario de 32 bits. Eso, a mi entender es dividir. Si lo queremos enfocar de otra manera, la operacion (N and 1) esta haciendo un (N mod 2). Y un mod es el resto de la división entera, por lo que tambien estamos dividiendo....

¿Que opinais? ¿El algoritmo está mal de base?, y ya por curiosidad... ¿alguien conoce algun metodo más sano (y mas optimo) de resolver el problema?

Salu2
__________________
PPlu
Responder Con Cita