Bueno lo hice de otra manera despues de estar toda la tarde liado pero no doy con la tecla y no me sale y se convierte en un bucle infinito. Pongo lo que tengo para ver si podeis ayudarme a dejarlo bien:
Código PHP:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <limits>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
bool IsOverflow (AnsiString valor)
{
bool overflow=false;
AnsiString valorLimite = std::numeric_limits<unsigned long long>::max();
if(valorLimite.Length() == valor.Length()){
for (int i=1; i <=valor.Length(); i++)
{
if(valorLimite[i] > valor[i]){
break;
}else if (valorLimite [i] < valor[i]){
overflow=true;
break;
}
}
}else if(valorLimite.Length() > valor.Length()){
overflow= false;
}else{
overflow=true;
}
return overflow;
}
//---------------------------------------------------------------------------
bool dividirHex(AnsiString dividendo, AnsiString divisor, AnsiString *cociente, AnsiString *resto)
{
unsigned __int64 auxDividendo, auxDivisor, auxCociente=0, auxResto=0;
bool salir=false;
bool retval=false;
int largoDividendo, largoDivisor, largoPorcion, pos=0;
largoDivisor=divisor.Length();
if (!IsOverflow (divisor)){
*cociente="";
*resto="";
auxDivisor = StrToInt64(AnsiString("0x" + divisor));
do {
largoDividendo=dividendo.Length ();
largoPorcion=largoDivisor;
if(largoDividendo >= largoDivisor+pos){
auxDividendo = StrToInt64(AnsiString("0x" + dividendo.SubString(1,largoPorcion+pos)));
if(IsOverflow(dividendo.SubString(1,largoPorcion))){
salir=true;
retval=false;
}else {
auxResto=auxDividendo % auxDivisor;
auxCociente=auxDividendo / auxDivisor;
if(auxCociente == 0){
pos++;
}else{
dividendo=dividendo.SubString(largoPorcion+pos+1,largoDividendo);
pos=0;
}
*cociente=*cociente + AnsiString ().sprintf("%I64X", auxCociente);
*resto = AnsiString().sprintf("%I64X", auxResto);
if (auxResto > 0 && auxCociente > 0)
dividendo= AnsiString().sprintf("%I64X", auxResto) + dividendo;
retval=true;
}
}else {
salir=true;
*cociente=*cociente + "0";
pos++;
if(dividendo != ""){
*resto = AnsiString().sprintf("%I64X", dividendo);
}else{
*cociente=*cociente + AnsiString().sprintf("%I64X", auxCociente);
*resto="0";
}
retval=true;
}
}while(!salir);
}
return retval;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString Dividendo="FFAECBF",Divisor="FF",Cociente,Resto;
dividirHex(Dividendo, Divisor, &Cociente, &Resto);
EditCociente->Text = Cociente;
EditResto->Text = Resto;
}
//---------------------------------------------------------------------------