AGB  ·  Datenschutz  ·  Impressum  







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

Array to Bin / Bin to Array

Ein Thema von totti14 · begonnen am 17. Jun 2017 · letzter Beitrag vom 17. Jun 2017
Antwort Antwort
totti14

Registriert seit: 26. Mai 2005
Ort: Bremen
90 Beiträge
 
Delphi 10.3 Rio
 
#1

Array to Bin / Bin to Array

  Alt 17. Jun 2017, 10:23
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

Geändert von totti14 (17. Jun 2017 um 10:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.006 Beiträge
 
Delphi 12 Athens
 
#2

AW: Array to Bin / Bin to Array

  Alt 17. Jun 2017, 10:57
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
totti14

Registriert seit: 26. Mai 2005
Ort: Bremen
90 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Array to Bin / Bin to Array

  Alt 17. Jun 2017, 11:04
Es läuft nacher unter OpenCL mit VS, also feinstes C 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.
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#4

AW: Array to Bin / Bin to Array

  Alt 17. Jun 2017, 12:28
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?

Geändert von mensch72 (17. Jun 2017 um 12:40 Uhr)
  Mit Zitat antworten Zitat
totti14

Registriert seit: 26. Mai 2005
Ort: Bremen
90 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Array to Bin / Bin to Array

  Alt 17. Jun 2017, 13:28
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 ?
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#6

AW: Array to Bin / Bin to Array

  Alt 17. Jun 2017, 18:31
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);

Geändert von mensch72 (17. Jun 2017 um 18:34 Uhr)
  Mit Zitat antworten Zitat
totti14

Registriert seit: 26. Mai 2005
Ort: Bremen
90 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Array to Bin / Bin to Array

  Alt 17. Jun 2017, 19:26
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.
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#8

AW: Array to Bin / Bin to Array

  Alt 17. Jun 2017, 21:40
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.
  Mit Zitat antworten Zitat
totti14

Registriert seit: 26. Mai 2005
Ort: Bremen
90 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Array to Bin / Bin to Array

  Alt 17. Jun 2017, 21:47
Da hast du recht. Danke
  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 21:41 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