![]() |
Array to Bin / Bin to Array
Hallo,
ih rechne z.Z folgende Aufgabe so: Data[0..2] := 481 * Data[0..2] + 171;
Delphi-Quellcode:
Geht das ganze eleganter unter flotter, da es als Teil später auf einer GPU laufen muss. Also kein StrToInt usw.
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] Gruß, Totti |
AW: Array to Bin / Bin to Array
Zitat:
|
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. |
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? |
AW: Array to Bin / Bin to Array
Jups, die Zahlen gehen nur von 0 ..9.
In Pascal
Delphi-Quellcode:
jetzt sieht der ASM schon viel besser aus und der Quelltext auch:) Nur warum im C die 48 gebraucht werden ?
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); |
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); |
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. |
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. |
AW: Array to Bin / Bin to Array
Da hast du recht. Danke
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 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