Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ähnliche case anweisungen vereinfachen (https://www.delphipraxis.net/64573-aehnliche-case-anweisungen-vereinfachen.html)

ferby 5. Mär 2006 12:57


ähnliche case anweisungen vereinfachen
 
Hallo,

Ich grübel schon eine ganze Zeit daran einen ganz ähnlichen Qeullcode zu vereinfachen


Delphi-Quellcode:
     case ord(system[i]) -64 of
        1: speicher[i]:=speicher[i] + FarbenToBit(BMP.canvas.Pixels[y,x], 2, 1);
        2: speicher[i]:=speicher[i] + FarbenToBit(BMP.canvas.Pixels[y,x], 4, 2);
        3: speicher[i]:=speicher[i] + FarbenToBit(BMP.canvas.Pixels[y,x], 8, 3);
        4: speicher[i]:=speicher[i] + FarbenToBit(BMP.canvas.Pixels[y,x], 16, 4);
        5: speicher[i]:=speicher[i] + FarbenToBit(BMP.canvas.Pixels[y,x], 32, 5);
        6: speicher[i]:=speicher[i] + FarbenToBit(BMP.canvas.Pixels[y,x], 64, 6);
        7: speicher[i]:=speicher[i] + FarbenToBit(BMP.canvas.Pixels[y,x], 128, 7);
        8: speicher[i]:=speicher[i] + FarbenToBit(BMP.canvas.Pixels[y,x], 256, 8);
      end;
Das einzige worin sich die Zeilen unterscheiden sind die letzten beiden Zahlenwerte,
ich komm aber nicht drauf wie ich das mit dem 2,4,8,16,32,etc löse
Zuerst dachte ich so villeicht

Delphi-Quellcode:
speicher[i]:=speicher[i] + FarbenToBit(BMP.canvas.Pixels[y,x], 2*(ord(system[i]) -64), ord(system[i]) -64);
aber das stimmt nur für die ersten 2 Zeilen..... kann wer das zusammenfasse?

Ferby

heiopei 5. Mär 2006 13:02

Re: ähnliche case anweisungen vereinfachen
 
hallo,
ich denke du musst statt 2 * (ord(system[i]) -64) eine Potenz berechnen. d.h. du musst 2 mit dem entspr. Faktor potenzieren, z.b. 2^1 = 2, 2^2 = 4 2^3 = 8...
also sowas wie Power(ord(system[i]) - 64) - die syntax von power weiss ich jetzt nicht mehr, kann man
aber leicht in der hilfe nachschaun

dann kannst du natürlich in einer if-schleife prüfen, ob ord(system[i]) - 64). im gewünschten bereich liegt, und dann
speicher[i] := speicher[i] + FarbenToBit(BMP.canvas.Pixels[y,x], Power(ord(system[i]) -64),
ord(system[i]) -64);
schreiben.

mfg,
heiopei

Flocke 5. Mär 2006 13:06

Re: ähnliche case anweisungen vereinfachen
 
Das mit dem Power war schon nicht schlecht, kann man aber auch mit einer einfachen Schiebeoperation machen:
Delphi-Quellcode:
code := ord(system[i]) - 64;
speicher[i] := speicher[i] + FarbenToBit(BMP.canvas.Pixels[y, x], 1 shl code, code);

ferby 5. Mär 2006 13:14

Re: ähnliche case anweisungen vereinfachen
 
Hallo,

Ich habe das mal mit dem Power gemacht

Delphi-Quellcode:
if ord(system[i]) -64 < 9 then
speicher[i]:=speicher[i] + FarbenToBit(BMP.canvas.Pixels[y,x], round(Power(2,ord(system[i]) -64)), ord(system[i]) -64 )
Habe Power bis jetzt nicht gekannt.
Wieso heißt diese Funktion Power, was hat "Power" mit Potenzrechnen zu tun?


@ Flocke: Ich blick nicht ganz durch was shl macht, auch die Delphi hilfe versteh ich da nicht ganz, wie kann ich mir das mit den Bit verschieben vorstellen?


Ferby

leddl 5. Mär 2006 13:19

Re: ähnliche case anweisungen vereinfachen
 
Zitat:

Zitat von ferby
Wieso heißt diese Funktion Power, was hat "Power" mit Potenzrechnen zu tun?

"Power" ist einfach die englische Bezeichnung für die Potenz! :zwinker:
Zitat:

Zitat von ferby
Ich blick nicht ganz durch was shl macht, auch die Delphi hilfe versteh ich da nicht ganz, wie kann ich mir das mit den Bit verschieben vorstellen?

Das Verschieben um ein Bit nach links ist im Endeffekt eine Multiplikation mit 2. Jedes Bit stellt ja eine andere 2er-Potenz dar. Verschiebst du jedes Bit eine Stelle nach links, multiplizierst du daher eben mit 2.

//edit:
selbiges im Dezimalsystem:
betrachte die Zahl 234567 und verschiebe alles eine Stelle nach links: => 2345670 ^= 234567 * 10 ;)

ferby 5. Mär 2006 13:29

Re: ähnliche case anweisungen vereinfachen
 
Hi,

Zitat:

"Power" ist einfach die englische Bezeichnung für die Potenz! Zwinkern

... und schon wieder etwas gelernt


Zitat:

selbiges im Dezimalsystem:
betrachte die Zahl 234567 und verschiebe alles eine Stelle nach links: => 2345670 ^= 234567 * 10
... danke jetzt hab ich's mal verstanden.

markusj 5. Mär 2006 13:32

Re: ähnliche case anweisungen vereinfachen
 
Anstelle jedes Mal das Quadrat zu berechnen könntest du auch einfach eine Array -Konstante mit diesen Werten anlegen, die du dann abfragst. Könnte sogar noch schneller sein.

mfG

Markus

JasonDX 5. Mär 2006 13:35

Re: ähnliche case anweisungen vereinfachen
 
Zitat:

Zitat von markusj
Anstelle jedes Mal das Quadrat zu berechnen könntest du auch einfach eine Array -Konstante mit diesen Werten anlegen, die du dann abfragst. Könnte sogar noch schneller sein.

AFAIK nicht, da einmal für den Index, und einmal für das Array selbst auf den Speicher zugegriffen werden muss. Das sind 2 Speicherzugriffe. Mit dem Shiften hat man 1x Speicherzugriff und 1x shiften. Da das shiften deutlich schneller ist als ein Speicherzugriff dürfte Flockes Code doch schneller sein als die Array-Variante.

greetz
Mike

markusj 5. Mär 2006 16:05

Re: ähnliche case anweisungen vereinfachen
 
Naja, mit sowas kenne ich mich nicht genau aus, ich habe nur bei einem eigenen Programm festgestellt, dass es eine Beschleunigung bewirkt. Die Zahlenwerte liegen dabei zwischen 2^0 und 2^7 (es geht um Bits).

mfG

Markus


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 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