mikrocontroller.net

Forum: PC-Programmierung Das kleine 1+1


Autor: Jean (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich bin ein Megaanfänger, der Byte Arrays in Integer umwandeln 
will und trotz hochentwickelten Neuheiten wie "Google" usw...nicht in 
der Lage ist.

Hintergrund: ich will ein paar Byte arrays addieren, das Ergebnis soll 
dann ebenfalls in einem Byte array gespeichert werden. ( Sprache c# )


z.b.

Ergebnis[0] = byte[0] + byte[1] + byte[2];

Ich bin zwar nur gelernter Metzger, aber "Ergebnis[0]" müsste ja erst 
Integer sein und dann in byte gewandelt werden?!
Davor müssten die byte arrays natürlich zu Integer gewandelt werden!?
Mich haben die ganzen Foren, die ich seit heut Morgen durchforste, 
ziemlich verwirrt

Bevor ihr mich auf andere Seiten verweist, tippt lieber kurz nen 
Beispiel für mich runter, ich kenn nämlich schon ( fast ) jede Seite im 
Web, die sich damit beschäftigt!!


Gruß

: Verschoben durch Moderator
Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jean schrieb:
> Bevor ihr mich auf andere Seiten verweist, tippt lieber kurz nen
> Beispiel für mich runter, ich kenn nämlich schon ( fast ) jede Seite im
> Web, die sich damit beschäftigt!!

Auch die, auf denen man die Grundlagen der C-Programmierung lernt?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Jean schrieb:
> ( Sprache c# )

Falsches Forum übrigens.

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned int ergebnis;

ergebnis = (byte[0] << 0) | (byte[1] << 8) | (byte[2] << 16) | (byte[3] << 24) ;

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jean schrieb:

> Beispiel für mich runter, ich kenn nämlich schon ( fast ) jede Seite im
> Web, die sich damit beschäftigt!!

Du solltest besser in die nächste Buchhandlung gehen und dir ein C# Buch 
kaufen.
Da hast du meistens mehr davon, als wenn du dir im Web anlassbedingt 
Halbwissen zusammensammelst. Gerade bei der ersten Programmiersprache 
sind die Grundlagen das um und auf. Alles hängt irgendwie über 5 Ecken 
mit allem anderen zusammen und diese Zusammenhänge versteht man nur dann 
wenn man systematisch an die Sache ran geht.

Bücher tun das. Da hat sich jemand einen systematischen Weg ausgedacht, 
wie er in kleinen Schritten vom einfachen zum Schwierigen kommt ohne den 
Leser zu überfordern und ohne dass zunächst Unlogikeiten ins Spiel 
kommen.

Web-Seiten (und auch Web-Tutorials) tun das in den wenigsten Fällen.

Autor: Jean (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Hilfe, aber ich hab jetzt folgendes gemacht:


int ergebnis


  
byte[] byte = new byte[7];
byte[] erg = new byte[1];
       
        byte[0] = 0x10;
  byte[1] = 0x20;
  byte[2] = 0x40;
  byte[3] = 0x80;
  
ergebnis = (byte[0] << 0) | (byte[1] << 8) | (byte[2] << 16) | (byte[3] << 24) ;
      
byte[] erg = System.BitConverter.GetBytes(ergebnis);

in das array "erg" soll dann das ergebnis in hex geschrieben werden, ich 
muss aber noch definieren wo genau oder?! z.b. erg[0] oder ?


zumindest kommen mal kein Fehler, aber richtig funktionieren tuts auch 
nicht.


@ kbuchegg

hast Recht, aber im Moment gehts wirklich nur um diese Kleinigkeit, wenn 
ich tiefer in die Richtung gehe, dann mach ich das natürlich..


Gruß

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Danke für die schnelle Hilfe, aber ich hab jetzt folgendes gemacht:

Da machst Du aber etwas komplett anderes als in Deinem 
Ursprungsbeitrag.

Wie wäre es, wenn Du Dich mal mit Deiner Aufgabenstellung beschäftigen 
würdest und versuchst, herauszufinden, was Du eigentlich erreichen 
willst?

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ergebnis[0] = byte[0] + byte[1] + byte[2];

Wenn du 3 Werte aus einem Zahlenbereich von 0 bis 255 addierst,
kommt ein Ergebnis von 0..765 raus, Ergebnis muß also in der
Lage sein, so grasse Zahlen auch aufzunehmen, also wenigstens
ein short, eventuell ein int oder long, wobei die jeweils
unsigned variante reichen würde, negative Werte können nicht
auftreten.

Wenn Ergebnis[0] ein byte ist, wird eventeull was abgeschnitten,
das tut C# nicht unbemerkt automatisch, sondern nur wenn du das
explizit so sagst:

Ergebnis[0] = (byte)(byte[0] + byte[1] + byte[2]);

Autor: Jean (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke MaWin, genau sowas hab ich gesucht. Mein Ergebnis kann theoretisch 
nie größer als 255 sein, von daher passt das so


Gruß

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal so ein Tip: Wenn du statt byte doch int nimmst läuft dein Programm 
ein bisschen schneller, da eine nBit Cpu mit einem nBit Wert am 
schnellsten rechnen kann (int ist auf einer 32bit CPU ein 32bit interger 
und auf 64bit ein 64bit Int). Bei dir wird das warscheinlich egal sein. 
Aber wenn dein Programm nur rechnet, bringt es einen kleinen 
Geschwindigkeitsbonus.
(genauso wird double schneller gerechnet als float).

-> Lange Rede kurzer Sinn: Speicher ist nicht mehr teuer, nimm einfach 
int und du musst dir keine Sorgen über einen Überlauf oder irgendwelchen 
Konvertierungen machen.

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab das mal in c# getestet:

Das ganze mit Optimierung:

Bei 1mrd Rechnungen erreicht int seinen Höhepunkt mit ca. 1.5% weniger 
Zeit.
Bei 10mrd sind es nur noch ca. 0,05%.
Bei 100mrd sind es -0,2%???.

Ich weiß nicht woran das liegt, aber wenn ich das Programm sowohl bei 
int und byte nur bis 100 rechnen lasse und dann wieder von 0 anfange ist 
int immer ca. 40% schneller.

Ich hab aber nur hochzählen lassen. Bei Multiplikation müsste das anders 
aussehen.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich würde behaupten das diese 1,5% im Rahmen des scheduling-bedingten 
Rauschen liegt.

Zumal der Compiler einen Großteil der Berechnungen optimieren wird, wenn 
du direkt davor Konstanten zuweist.

Autor: fz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Samuel K. schrieb:
> ne nBit Cpu mit einem nBit Wert am
> schnellsten rechnen kann (int ist auf einer 32bit CPU ein 32bit interger
> und auf 64bit ein 64bit Int).

In c# ist das nicht so dort ist int immer ein 32 Bit Wert.

fz

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist ja wirklich so. Sry hab ich nicht gewusst. Was macht der Compiler 
denn, wenn man auf 64bit compiliert. Das wird doch langsamer.

Vlad Tepesch schrieb:
> ich würde behaupten das diese 1,5% im Rahmen des scheduling-bedingten
> Rauschen liegt.

Also stimmen tut es aufjedenfall, schließlich steht es in einem ProgBuch 
von mir. Aber ich wollte aber nicht mit Zufallszahlen rechnen, da ich 
keine Ahnung habe wie diese Random.Next Methode arbeitet. Am Ende wird 
sie verschieden schnell augeführt wird.

Wie erklärst du das Verhalten wenn man
if(i > 100)
    i = 0;
einfügt, es 40% schneller ist?

Hat jmd vielleicht lust den Test mal in c++ zu machen? Ich hab bisher in 
c++ nur spiele mit allegro programmiert. Deswegen weiß ich auch nur wie 
man Allegro benutzt, Vectoren und listen nutzt usw. Aber nicht wie man 
zeit stoppt.

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gettimeofday(...) und timersub(...) sind die gesuchten freunde

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.