AGB  ·  Datenschutz  ·  Impressum  







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

ähnliche case anweisungen vereinfachen

Ein Thema von ferby · begonnen am 5. Mär 2006 · letzter Beitrag vom 5. Mär 2006
Antwort Antwort
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#1

ähnliche case anweisungen vereinfachen

  Alt 5. Mär 2006, 13:57
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

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
  Mit Zitat antworten Zitat
heiopei
(Gast)

n/a Beiträge
 
#2

Re: ähnliche case anweisungen vereinfachen

  Alt 5. Mär 2006, 14:02
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
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: ähnliche case anweisungen vereinfachen

  Alt 5. Mär 2006, 14:06
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);
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#4

Re: ähnliche case anweisungen vereinfachen

  Alt 5. Mär 2006, 14:14
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
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#5

Re: ähnliche case anweisungen vereinfachen

  Alt 5. Mär 2006, 14:19
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!
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
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#6

Re: ähnliche case anweisungen vereinfachen

  Alt 5. Mär 2006, 14:29
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.
  Mit Zitat antworten Zitat
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#7

Re: ähnliche case anweisungen vereinfachen

  Alt 5. Mär 2006, 14:32
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
Markus
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#8

Re: ähnliche case anweisungen vereinfachen

  Alt 5. Mär 2006, 14:35
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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#9

Re: ähnliche case anweisungen vereinfachen

  Alt 5. Mär 2006, 17:05
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
Markus
  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 13:26 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