Forum: PC-Programmierung Das kleine 1+1


von Jean (Gast)


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
von Klaus W. (mfgkw)


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?

von Klaus W. (mfgkw)


Lesenswert?

Jean schrieb:
> ( Sprache c# )

Falsches Forum übrigens.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Jean (Gast)


Lesenswert?

Danke für die schnelle Hilfe, aber ich hab jetzt folgendes gemacht:


int ergebnis


1
  
2
byte[] byte = new byte[7];
3
byte[] erg = new byte[1];
4
       
5
        byte[0] = 0x10;
6
  byte[1] = 0x20;
7
  byte[2] = 0x40;
8
  byte[3] = 0x80;
9
  
10
ergebnis = (byte[0] << 0) | (byte[1] << 8) | (byte[2] << 16) | (byte[3] << 24) ;
11
      
12
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ß

von Rufus Τ. F. (rufus) Benutzerseite


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?

von MaWin (Gast)


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]);

von Jean (Gast)


Lesenswert?

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


Gruß

von Sam .. (sam1994)


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.

von Sam .. (sam1994)


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.

von Vlad T. (vlad_tepesch)


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.

von fz (Gast)


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

von Sam .. (sam1994)


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.

von D. I. (Gast)


Lesenswert?

gettimeofday(...) und timersub(...) sind die gesuchten freunde

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.