Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-04-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
dividir número hexa muyyyy grande

Hola amigos, necesito realizar la siguiente division:
0xFFFFFFFFFFFFFFFFFFFFFFFF / 0xFFFFFFFFF
no he encontrado una calculadora que lo soporte y me gustaría saber si conocen alguna aplicación que me permita realizar lo o, en su defecto, como se haría a mano.
También necesito pasar el resultado al sistema decimal.
Responder Con Cita
  #2  
Antiguo 17-04-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Google da como resultado

1.1529215e+18

Como es un numero tan grande te queda en notacion cientifica
Responder Con Cita
  #3  
Antiguo 17-04-2015
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 13
engranaje Va por buen camino
Yo lo que suelo hacer en esos casos es partimos la cadena en trozos mas pequeños que si pueda dividir. Despues averiguo el resto y concateno el trozo siguiente de la parte de la cadena que que falta por tratar al resto. Es como cuando en una división "bajamos"
la parte del dividendo que aún no hemos tratado al lado del resto.

En delphi me queda algo así.
Código Delphi [-]
while length(strCadenaTratandose) > 6 do
begin
      strParteTratandose := copy(strCadenaTratandose,0,6);
      iParte := strtoint(strParteTratandose);

      iMod:= iparte mod  68;

      strCadenaTratandose :=  inttostr(iMod) +                       
                              copy(strCadenaTratandose,7,length(strCadenaTratandose));

  end;
Creo que mas o menos algo así debería servirte.

PErdón, edito porque me he dado cuenta de que no he respondido tu pregunta y esto solo te serviría para averiguar el resto final. no el cociente que es lo que buscas

Última edición por engranaje fecha: 17-04-2015 a las 09:06:40.
Responder Con Cita
  #4  
Antiguo 17-04-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Además tendría otro problema ya que el divisor es mayor que un entero con lo que pasar una parte del dividendo a entero no tiene mucho sentido ya que el divisor será mayor. Habría que usar enteros de 64 bits y ahí si que podría hacer eso pero que yo sepa no existe la función StringToInt64.
De todos modos me interesa el tema y me gustaría saber como hacer eso a mano y ya de paso sumar, restar, y multiplicar con hexadecimales.
Responder Con Cita
  #5  
Antiguo 17-04-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Se me ocurre algo asi:
Código PHP:
#include <intypes.h>

bool dividirHex(AnsiString dividendoAnsiString divisorAnsiString *cocienteAnsiString *Resto)
{
   
__uint64 auxDividendoauxDivisorauxCociente=0auxResto=0;
   
bool salir=false;
   
bool retval=false;
   
int largoDividendolargoDivisorlargoPorcionpos;
   *
cociente="";
   *
resto="";
   
largoDivisor=divisor.Lenght();
   
auxDivisor=sprintf("%UINT64"AnsiString ("0x" divisor).c_str ());

   do {
      
largoDividendo=dividendo.Lenght ();
      
largoPorcion=largoDivisor;
      if (
largoDividendo >= largoDivisor){
         if(
auxDivisor sprintf("%UINT64"AnsiString ("0x" dividendo.SubString(1,largoPorcion)).c_str()){
            if(
largoDividendo largoDivisor){
               
largoPorcion++;
            }else{
               break;
            }
         }
         
auxDividendo=sprintf("%UINT64"AnsiString ("0x" dividendo.SubString(1,largoPorcion)).c_str());
         
auxResto=auxDividendo auxDivisor;
         
dividendo=dividendo.SubString(largoPorcionlargoDividendo);
         
auxCociente=auxDividendo auxDivisor;
         *
cociente=*cociente AnsiString (auxCociente);
         *
resto=AnsiString(auxResto);
          if (
auxResto 0)
            
dividendo= *resto dividendo.SubString(largoPorcion,largoDividendo);
         else
            
dividendodividendo.SubString(largoPorcion,largoDividendo);
         
retval=true;
      }else{
         
salir=true;
      }
   }while(!
salir);
   return 
retval;

Lo he escrito en el móvil y no está probado. ¿que os parece? Creo que lo que le faltaría es saber si el cociente desborda el int64 y si es así salir con false pero no se como comprobar eso. Supongo que seria obteniendo el valor máximo de un int64 y luego comparó carácter por carácter contra la cadena del cociente de izquierda a derecha mientras sean iguales hasta llegar al último o hasta que sea mayor el del dividendo. Si es mayor salgo del bucle y retorno false. Si es menor salgo del bucle y continuo con lo demás.

Última edición por aguml fecha: 17-04-2015 a las 13:05:26.
Responder Con Cita
  #6  
Antiguo 28-04-2015
alquimista alquimista is offline
Miembro
 
Registrado: ene 2008
Posts: 203
Poder: 17
alquimista Va por buen camino
La calculadora que hice y de la que hable en el foro, realiza la operación que comentas:

Hex('FFFFFFFFFFFFFFFFFFFFFFFF') /Hex('FFFFFFFFF') //pasa hex a decimal
Resultado: 1.15292150462362E18
-------
DectoHex(1.15292150462362E18) //pasa decimal a hex
Resultado:1000000000FFF000
-------
Hex('1000000000FFF000')
resultado: 1152921504623620096
--------
Esta en sourceforge como CALCUFP.

Esta también código fuente

Espero te sea útil.
Saludos

PD: Creo recordar que puse el código hexadecimal en JvInterpreter_Misc.pas
Responder Con Cita
Respuesta



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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
[Aporte] TDecBinHex - Números binarios/decimales/hexa BrunoBsso Varios 17 11-02-2011 14:32:10
Dividir un TIME por un numero de repeticiones creus Varios 2 16-01-2007 21:19:25
Convertir hexa a decimal dmasson Varios 4 05-02-2006 15:48:05
Codigo de la imagen, pasar a hexa emeceuy Gráficos 1 03-11-2004 18:45:55
De entero a hexa, y hexa a entero (o string) emeceuy Varios 5 02-06-2004 18:23:13


La franja horaria es GMT +2. Ahora son las 13:59:38.


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