Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Brauche asm-Hilfe (https://www.delphipraxis.net/9021-brauche-asm-hilfe.html)

Illuminator-23-5 16. Sep 2003 19:45


Brauche asm-Hilfe
 
hi leute!
ich versuch grad, 'nen Binärzähler zu proggen, der so schnell wie möglich ist... (in einer Konsolenanwendung)
Ich bin so weit gekommen:

Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  a, b: string;
  bytes, i: integer;
begin
  a := '';
  b := '';
  readln(bytes);
  for i := 1 to bytes do begin
    a := a + '0';
    b := b + '1';
  end;
  //Ab hier wird die Zeit gestoppt
  writeln(a);
  while a <> b do begin
    i := bytes;
    while a[i] = '1' do begin
      a[i] := 0;
      dec(i);
    end;
    a[i] := '1':
  end;
  //Hier wird die Zeitmessung beenden
end.
Es geht relativ schnell, nur immer noch zu langsam, und da hab ich mir gedacht, könnte man einen Teil in assembler umwandeln. Kennt sich da jemand aus und kann/möchte mir Helfen?

jbg 16. Sep 2003 20:52

Re: Brauche asm-Hilfe
 
Zitat:

Zitat von Illuminator-23-5
könnte man einen Teil in assembler umwandeln.

Sicher wäre das möglich, nur ob der Code dann schneller ist, als der vom Compiler erzeugte, ist nicht garantiert.


Das "writeln(a);" brauch im Vergleich zum Algorithmus sehr sehr lange.

Zitat:

Delphi-Quellcode:
  while a <> b do begin
    i := bytes;
    while a[i] = '1' do begin
      a[i] := 0;
      dec(i);
    end;
    a[i] := '1':
  end;

Bist du sicher, dass da kein Fehler drinnen steckt? Denn das würde ich ganz einfach per "a := b" lösen. Da fehlt doch sicherlich was.

Illuminator-23-5 16. Sep 2003 20:55

Re: Brauche asm-Hilfe
 
hab das writeln vergessen
nach a[i] := '1'; kommt
writeln(a);
:oops:

jbg 16. Sep 2003 23:40

Re: Brauche asm-Hilfe
 
Zitat:

Zitat von Illuminator-23-5
hab das writeln vergessen

Und genau das ist die Zeile, die am meisten Rechenleistung verbracht.

negaH 17. Sep 2003 01:52

Re: Brauche asm-Hilfe
 
Wie groß sollen die binärzahlen eigentlich sein ? Ich frage weil es eigentlich idiotisch ist auf einem Binären Rechner, sprich dem Computer, mit Strings statt mit Integern zu arbeiten. Ein Integer/Cardinal/Int64 ist nichts anderes wie eine Binärzahl. Also einfach den Binären String in einen Int64 umgewandelt und dann damit gerechnet. Zur Ausgabe wieder in einen Binären String umwandeln.

Delphi-Quellcode:
function BINToInt(const Value: String): Int64;
begin
  Result := 0;
  for I := Length(Value) downto 1 do
    Inc(Result, Result + Ord(Value[I]) - Ord('0'));
end;

function IntToBIN(Value: Int64): String;
begin
  Result := StringOfChar('0', 63);
  I := 0;
  while Value <> 0 do
  begin
    if Odd(Value) then Result[I] := '1';
    Value := Value shr 1;
    Inc(I);
  end;
end;
Gruß Hagen

Illuminator-23-5 17. Sep 2003 17:34

Re: Brauche asm-Hilfe
 
er sollte am ende so groß sein können, wie nur möglich, und von einer bestimmten ausgangszahl bis zu einer bestimmten zahl zählen können! (sprich auch größer als 64 bit...)


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz