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
  #4  
Antiguo 30-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Estuve jugando un poco con esto de los números GRANDES, y he llegado hasta aquí. En ningún caso los algoritmos están optimizados, pero si no los quieres para nada muy serio te pueden servir.

Código Delphi [-]
type
  TSuperLargo = array[0..15] of Byte;

function AddSuper(var a,b: TSuperLargo; Acarreo: Integer): TSuperLargo; overload;
var
  i,j: integer;
begin
  for i := 0 to 15 do
  begin
    j:= (Integer(a[i]) + Integer(b[i])) + Acarreo;
    Result[i]:= j mod 256;
    Acarreo:= j div 256;
  end;
end;

function AddSuper(a,b: TSuperLargo): TSuperLargo; overload;
begin
  Result:= AddSuper(a,b,0);
end;

function SubSuper(a,b: TSuperLargo): TSuperLargo;
var
  i: integer;
begin
  for i := 0 to 15 do
    b[i]:= b[i] xor $FF;
  Result:= AddSuper(a,b,1);
end;

function MulSuper(a: TSuperLargo; b: Byte): TSuperLargo; overload;
var
  i,j: integer;
  Acarreo: Integer;
begin
  Acarreo:= 0;
  for i := 0 to 15 do
  begin
    j:= (Integer(a[i]) * Integer(b)) + Acarreo;
    Result[i]:= j mod 256;
    Acarreo:= j div 256;
  end;
end;

function ShiftLSuper(a: TSuperLargo): TSuperLargo;
var
  i: integer;
begin
  Result[0]:= 0;
  for i:= 0 to 14 do
    Result[i+1]:= a[i];
end;

function ShiftRSuper(a: TSuperLargo): TSuperLargo;
var
  i: integer;
begin
  Result[15]:= 0;
  for i:= 1 to 15 do
    Result[i-1]:= a[i];
end;

function MulSuper(a,b: TSuperLargo): TSuperLargo; overload;
var
  i: integer;
begin
  FillChar(Result,Sizeof(Result),0);
  for i:= 15 downto 0 do
  begin
    Result:= ShiftLSuper(Result);
    Result:= AddSuper(Result,MulSuper(a,b[i]));
  end;     
end;

function int64ToSuper(a,b: int64): TSuperLargo;
var
  i: integer;
begin
  for i:= 0 to 7 do
  begin
    Result[i]:= Byte((a shr (8*i)) and $FF);
    Result[i+8]:= Byte((b shr (8*i)) and $FF);
  end;
end;

procedure SuperToInt64(S: TSuperLargo; var a: int64; var b: int64);
var
  i: integer;
begin
  for i:= 7 downto 0 do
  begin
    a:= (a shl 8) + S[i];
    b:= (b shl 8) + S[i+8];
  end;
end;

Con esto puedes hacer operaciones simples: suma, resta, multiplicación, desplazamientos, la división se me antojaba muy complicada

Código Delphi [-]
// Ejemplo
var
  a,b: TSuperLargo;
  x,y: int64;
begin
  a:= int64ToSuper(1000,0);
  b:= int64ToSuper($2222,$5533);
  b:= AddSuper(a,b);
  SuperToInt64(b,x,y);
end;

En fin, si quieres realizar algo un poco serio, encontraras librerías en Internet para manejar números grandes, pero para algo sencillo esto te puede servir.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Tipo de datos no coincide Genner SQL 5 08-05-2006 17:14:40
Tipo de base de datos CARSOFT_AR Varios 6 06-02-2006 17:49:26
Urg: Problema con el tipo IDirectDrawSurface DarkByte Varios 2 31-08-2005 21:53:51
Tipo de datos Letty Conexión con bases de datos 4 13-01-2004 21:19:48
Problema con Tipo de Campo hjuarez Conexión con bases de datos 2 30-08-2003 05:16:15


La franja horaria es GMT +2. Ahora son las 05:57:42.


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