AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

bitmap32 and xor

Ein Thema von Trinity.dp · begonnen am 17. Sep 2011 · letzter Beitrag vom 18. Sep 2011
Antwort Antwort
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#1

AW: bitmap32 and xor

  Alt 17. Sep 2011, 12:56
1. Ich verstehe nicht, was das Problem ist, weil du es nicht genau formuliert hast.
Was genau ist der Fehler; was soll geschehen, was geschieht?

2. In der Funktion IntToBin() ist ein potenzieller Fehler:
Wenn Digits < als Anzahl der tatsächlichen Stellen (Index Fehler, da digits < 1 aber einer gewissen Anzahl von Schleifendurchläufen -> anders lösen)!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Trinity.dp

Registriert seit: 27. Nov 2009
8 Beiträge
 
#2

AW: bitmap32 and xor

  Alt 17. Sep 2011, 13:03
Hallo Aphton!

1. Ich verstehe nicht, was das Problem ist, weil du es nicht genau formuliert hast.
Was genau ist der Fehler; was soll geschehen, was geschieht?
Das tut mir Leid. Ich war wohl zu sehr in der Materie. Ich habe oben den Output und das konkrete Problem ergänzt.

2. In der Funktion IntToBin() ist ein potenzieller Fehler:
Wenn Digits < als Anzahl der tatsächlichen Stellen (Index Fehler, da digits < 1 aber einer gewissen Anzahl von Schleifendurchläufen -> anders lösen)!
Die IntToBin Funktion dient nur zum Testen. Aber danke für den Hinweis!
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: bitmap32 and xor

  Alt 17. Sep 2011, 13:37
Oh warte mal. (Alles wieder löschen...)

Deine MemoryAsString() ist auch fehlerhaft. Per CopyMemory kopierst du nicht einzelne Bits, sondern ganze Bytes. Deshalb ist diese Codesequenz auch falsch:
Delphi-Quellcode:
  CopyMemory(@buffer, p, 1);
  if buffer then
    result := result + '1'
Dh. der Output ist womöglich auch inkorrekt!

Den Assembler Code möchte ich momentan nicht entziffern, aber ich schätze mal, da sind auch welche Fehler. Und warum das Ganze in Assembler? Geht ja auch ganz normal?!

probier
Delphi-Quellcode:
procedure XorMemBlock(Source1, Source2, Destination: PByte; Count: Integer);
begin
  while Count > 0 do
  begin
    Destination^ := Source1^ xor Source2^;
    inc(Source1);
    inc(Source2);
    inc(Destination);
  end;
end;
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (17. Sep 2011 um 13:39 Uhr)
  Mit Zitat antworten Zitat
Trinity.dp

Registriert seit: 27. Nov 2009
8 Beiträge
 
#4

AW: bitmap32 and xor

  Alt 17. Sep 2011, 13:45
Oh warte mal. (Alles wieder löschen...)

Deine MemoryAsString() ist auch fehlerhaft. Per CopyMemory kopierst du nicht einzelne Bits, sondern ganze Bytes. Deshalb ist diese Codesequenz auch falsch:
Delphi-Quellcode:
  CopyMemory(@buffer, p, 1);
  if buffer then
    result := result + '1'
Dh. der Output ist womöglich auch inkorrekt!
Der Output müsste stimmen. Die Funktion war nur ein Überbleibsel von meinem weiteren Test und wird an keiner Stelle benutzt (hab sie jetzt auch gelöscht).

Den Assembler Code möchte ich momentan nicht entziffern, aber ich schätze mal, da sind auch welche Fehler. Und warum das Ganze in Assembler? Geht ja auch ganz normal?!

probier
Delphi-Quellcode:
procedure XorMemBlock(Source1, Source2, Destination: PByte; Count: Integer);
begin
  while Count > 0 do
  begin
    Destination^ := Source1^ xor Source2^;
    inc(Source1);
    inc(Source2);
    inc(Destination);
  end;
end;
Assembler Code müsste eigentlich auch stimmen. Ich brauche Geschwindigkeit. Dein Code gibt leider einen Fehler. Ich schaue mal ob ich diesen finden kann!

Vielen Dank schon mal, auch wenn ich immer noch ganz am Anfang stehe.

Edit: Ok es fehlte wirklich nur das decrease. Und mit deinem Code funktioniert es auch. Dann muss ich wohl noch mal den Assembler-Code anschauen.

Edit2: Vielen lieben Dank! Du hast mir sehr geholfen.

Geändert von Trinity.dp (17. Sep 2011 um 13:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: bitmap32 and xor

  Alt 17. Sep 2011, 13:47
Ach echt? Habs ja auch nicht getestet, nur schnell hingetippt. Mal kucken...
Ok. Stimmt sry, habe dec(Count) in der Schleife vergessen:

Delphi-Quellcode:
procedure XorMemBlock(Source1, Source2, Destination: PByte; Count: Integer);
begin
  while Count > 0 do
  begin
    Destination^ := Source1^ xor Source2^;
    inc(Source1);
    inc(Source2);
    inc(Destination);
    dec(Count);
  end;
end;
Assembler <> Geschwindigkeit, denn letzendlich wird der Delphi-Code, sofern richtig programmiert, auch in Assembler-Code konvertiert (kompiliert)!
Außer du wendest Assembler-eigene Tricks an, die ich nirgends sehe!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (17. Sep 2011 um 13:50 Uhr)
  Mit Zitat antworten Zitat
Trinity.dp

Registriert seit: 27. Nov 2009
8 Beiträge
 
#6

AW: bitmap32 and xor

  Alt 17. Sep 2011, 13:58
Assembler <> Geschwindigkeit, denn letzendlich wird der Delphi-Code, sofern richtig programmiert, auch in Assembler-Code konvertiert (kompiliert)!
Außer du wendest Assembler-eigene Tricks an, die ich nirgends sehe!
Du hast recht. Dein Code ist nur unwesentlich langsamer als der Assembler-Code (~600ms vs ~450ms). Das sollte für meine Zwecke immer noch reichen. Du kannst dir gar nicht vorstellen wie glücklich ich bin! Vielen, vielen Dank!
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

AW: bitmap32 and xor

  Alt 17. Sep 2011, 17:37
Man kann übrigens auch verständlichen Assembler-Code schreiben

Delphi-Quellcode:
procedure MemBlockXOR_2(Source1, Source2, Destination: Pointer; Count: Integer);
asm
  push edi;
  push esi;

  mov esi, eax;
  mov edi, ecx;
  mov ecx, Count;
  shr ecx, 2; // div by 4 (sizeof int)

  // esi <- Source1
  // edx <- Source2
  // edi <- Destination
  // ecx <- Count

  // exit if count = 0
  test ecx, ecx;
  jz @@end;

  @@loop:
  mov eax, [esi];
  xor eax, [edx];
  mov [edi], eax;

  add esi, 4;
  add edx, 4;
  add edi, 4;

  dec ecx;
  jnz @@loop;

  @@end:

  pop esi;
  pop edi;
end;
Einen Tick schneller als dein ursprünglicher Code ist er zudem auch noch, und er besteht alle Tests. Allerdings funktioniert er nur bei ganzen Integer-Grenzen, also wenn Count durch 4 teilbar ist, sonst wird der Rest abgeschnitten (nicht ge-xor’t). Wie dein Original-Code das handhabt, konnte ich nicht entziffern. Aphtons Variante funktioniert immer, ist jedoch langsamer, weil sie mit Bytes arbeitet.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz