Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #11  
Antiguo 03-06-2003
pplu pplu is offline
Miembro
 
Registrado: jun 2003
Posts: 17
Poder: 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
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 22:26:54.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi