Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Array to Bin / Bin to Array (https://www.delphipraxis.net/193071-array-bin-bin-array.html)

totti14 17. Jun 2017 10:23

Array to Bin / Bin to Array
 
Hallo,
ih rechne z.Z folgende Aufgabe so: Data[0..2] := 481 * Data[0..2] + 171;
Delphi-Quellcode:
Var
  Data:[0..2] of byte;
  v9 : Integer;

...
  Data[0]:= 4; Data[1]:= 7; Data[2]:= 5;
  v9 := (100 * Data[0]) + (10 * Data[1] + Data[2]); // [4][7][5] = v9 =475  := StrToInt()
  v10 := (481 * v9 + 117) mod 1000; // V10 = 592
  Data[0] := v10 div 100; // Index[0] [ 5 ][7][5]
  // --
  v8 := (Word(v10) div 100) shl 16;
  v8 := v8 + (Word(v10) mod 100); // v8 = 327772
  // --
  Data[1] := byte(v8) div 10; // Index[1] [5][ 9 ][5]
  // --
  Data[2] := Word(v10) mod 10; // Index[2] Rest
  // = [5][9][2]
Geht das ganze eleganter unter flotter, da es als Teil später auf einer GPU laufen muss. Also kein StrToInt usw.

Gruß, Totti

Uwe Raabe 17. Jun 2017 10:57

AW: Array to Bin / Bin to Array
 
Zitat:

Zitat von totti14 (Beitrag 1374737)
da es als Teil später auf einer GPU laufen muss.

In dem Fall wäre der zur Verfügung stehende Befehlssatz der GPU relevant und nicht der Delphi-Code.

totti14 17. Jun 2017 11:04

AW: Array to Bin / Bin to Array
 
Es läuft nacher unter OpenCL mit VS, also feinstes C :-D Mit
OpenCL2Delphi scheitert es schon bei der definition und im VS bekommt man anständige Fehlerpunkte, was als OPL Anfänger perfekt ist.
Unter Delphi soll es aber auch schon flott gehen, da ich ich das unter OCL nur zum testen mache.

mensch72 17. Jun 2017 12:28

AW: Array to Bin / Bin to Array
 
feinstes "C"..

na warum dann nicht "i=atoi(pa)" und "pa=itoa(i)" oder "sscanf(&dat[0],"%03d",&i) und sprintf(&dat[0],"%03d",i) ?

(ich würde dir aber den Tip geben, mit einem lokalem Zusatzpuffer zu arbeiten, der die 3 Zeichen "Null-terminiert" drin hat(also ein Byte länger ist) und dann mit "strncpy" auslesen und mit "memcpy" zurückschreiben... eben so wie man es in "C" immer tut :) )


ansonsten wenn es immer ASCII dezimal 3stellig mit führend "0" ist geht es auch so sehr effektiv "in feinstem C":

int i;
i=(int)(dat[0]&0x0f)*100 + (int)(dat[1]&0x0f)*10 + (int)(dat[2]&0x0f);
i= 481 * i + 171;
dat[0]=0x30 + ((i/100)%10);
dat[1]=0x30 + ((i/10)%10);
dat[2]=0x30 + (i%10);

wenn das Result auch nur 3 stellig sein darf, klappt das aber nur für "i=0" und "i=1" weil es ab Input "i>=2" im Result mehr wie 3stellig wird !?
... bist du dir sicher, die Aufgabe hier korrekt und vollständig beschrieben zu haben?

totti14 17. Jun 2017 13:28

AW: Array to Bin / Bin to Array
 
Jups, die Zahlen gehen nur von 0 ..9.

In Pascal
Delphi-Quellcode:
 i := Data[k] * 100 + Data[1] * 10 + Data[2];
 i := 481 * i + 117;
 Data[0] := ((i div 100) mod 10);
 Data[1] := ((i div 10) mod 10);
 Data[2] := (i mod 10);
jetzt sieht der ASM schon viel besser aus und der Quelltext auch:) Nur warum im C die 48 gebraucht werden ?

mensch72 17. Jun 2017 18:31

AW: Array to Bin / Bin to Array
 
gehen nur von 0..9... binär oder als (ASCII)Zeichen ???

wenn ASCII, dann so:

i := Integer(Data[0] and $0f) * 100 + Integer(Data[1] and $0f) * 10 + Integer(Data[2] and $0f);
i := 481 * i + 117;
Data[0] := $30 + ((i div 100) mod 10);
Data[1] := $30 + ((i div 10) mod 10);
Data[2] := $30 + (i mod 10);

totti14 17. Jun 2017 19:26

AW: Array to Bin / Bin to Array
 
Ohne den Ascii Offset stimmt das Ergebnis, also Bin.
Die vier And kann ich mir ja sparen, da jeder Index nur von 0..9 geht.

mensch72 17. Jun 2017 21:40

AW: Array to Bin / Bin to Array
 
ok, spare dir die "and"... aber ich finde den expliziten Cast auf Integer wichtig, denn "ein Byte als 8Bit-Wert" * 100 ergibt mit 8Bit eigentlich nix sinnvolles weil das den 8Bit Wertebereich nominal ab 3 sprengt!

Mag sein das die Compiler das erkennen und den Datentyp automatisch erweitern, aber es ist "optisch" verständlicher wenn man hier explizit sagt/schreibt das alles weitere in dem größerem Datentyp gerechnet werden soll/muss.

totti14 17. Jun 2017 21:47

AW: Array to Bin / Bin to Array
 
Da hast du recht. Danke


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