Gast
#1615185
Hallo, Ich habe ein Array[8]=(1,1,1,1,1,1,1,1) Als Integer soll dann 255 raus kommen. oder so Array[0,0,0,0,1,1,1,1] Integer=15 also von byte nach int. Danke
|
Anzeige
|
Array[8] mit 0 und 1 zu integer zb 255
Gast
#1615185
Hallo, Ich habe ein Array[8]=(1,1,1,1,1,1,1,1) Als Integer soll dann 255 raus kommen. oder so Array[0,0,0,0,1,1,1,1] Integer=15 also von byte nach int. Danke Ist doch ganz einfach...
MfG Marius Ich würde das doch etwas kopiersicherer machen ;-)
Aber ich bin mir noch gar nicht so sicher, dass es wirklich das ist, was du willst. Sind in dem Array wirklich binäre 0-en und 1-en oder sind das ASCII-Zeichen, die über irgendeine Schnittstelle hereinkommen. Also evtl. eher sowas:
Gast
#1617534
Andi schrieb:
> Als Integer soll dann 255 raus kommen.
Wozu diese Verschwendung von 16 Bit (int)?
255 paßt bequem in ein "unsigned char" oder besser "uint8_t".
Peter
>> Als Integer soll dann 255 raus kommen. > Wozu diese Verschwendung von 16 Bit (int)? Meine Integer haben sogar 32 Bits... ;-)
Gast
#1617643
Ich biete 64 glaube ich nicht, wo das denn?
Gast
#1626446
klaus schrieb: > value = 0; > > for(i=0; i < sizeof(Array); ++i) > > { > > value = (value << 1) | Array[i]; > > } Damit fängst Du ab dem 1-ten statt dem nullten Element des Arrays an. in der for-Schleife wäre i++ statt ++i richtig ;) hä? Ich glaube, du hast ein anderes C als ich. @ blup (Gast) >Damit fängst Du ab dem 1-ten statt dem nullten Element des Arrays an. >in der for-Schleife wäre i++ statt ++i richtig ;) Ist hier vollkommen egal, dieser Codeabschnitt wird erst NACH dem ersten Schleifendurchlauf das erste Mal ausgeführt. MFG Falk
Gast
#1626511
blup schrieb: > Damit fängst Du ab dem 1-ten statt dem nullten Element des Arrays an. > in der for-Schleife wäre i++ statt ++i richtig ;) Hast du für diese seltsame These auch eine Begründung?
Gast
#1627187
ja. Je nach Compiler wird der Wert von i direkt erhöht. Das hat zur
Folge, dass der Zugriff auf Array[i] gleich beim ersten mal auf Array{1]
zeigt, statt wie gewollt auf Array[0].
Bin vor paar Jahren während ner Studienarbeit drüber gestäupert und sehr
sehr kange gesucht :)
blup schrieb: > ja. Je nach Compiler wird der Wert von i direkt erhöht. Das hat zur > Folge, dass der Zugriff auf Array[i] gleich beim ersten mal auf Array{1] > zeigt, statt wie gewollt auf Array[0]. Ähm. Nein. Das war dann in irgend einer anderen Sprache. Aber nicht in C.
ist per Definition identisch zu
und das ist so, seit der allererste C-Compiler geschrieben wurde. Das einzige was sich mit der letzten Norm C99 verändert hat, ist ein zusätzlicher Scope um die Schleife herum, die es erlaubt 'lokale' Variablen innerhalb der for-Schleife bereits beim init zu benutzen.
(wobei die Bezeichnungen der Einzelteile der for-Schleife eher symbolischen Wert haben und die typische Verwendung anzeigen. > Bin vor paar Jahren während ner Studienarbeit drüber gestäupert und sehr > sehr kange gesucht :) Du magst lange nach einem Fehler gesucht haben. Aber das war er nicht. Es ist kaum vorstellbar, dass ein Compiler mit einem derartigen Fehler das Compilerbaulabor unbemerkt verlässt. Jede noch so grindige Compiler-Testsuite würde so einen Fehler in den ersten 10 Sekunden entdecken. Pikanterweise geht der Rat an alle, die sowohl C als auch C++ programmieren, der Version ++i den Vorzug zu geben :-) Also for( i=0; i < sizeof(Array); ++i ) anstelle von for( i=0; i < sizeof(Array); i++) Warum ist das so? Bei int oder anderen eingebauten Datentypen macht es keinen Unterschied. Ist i aber ein anderer Datentyp, eine Klasse, kann es einen Unterschied in der Ausführungsgeschwindigkeit geben. ++i ist für den Compiler dann nämlich leichter zu optimieren als i++, weil man nicht darauf angewiesen ist, dass der Compiler ein sog. Temporary (also ein Objekt welches nur während der Auswertung existiert) wegzuoptimieren, weil sein Wert nicht benutzt wird. Funktional sind beide Versionen identisch. Bei eingebauten Datentypen sowieso, bei eigenen Datentypen sollten es auch so sein, wenn präfix und postfix ++ richtig und konsistent implementiert sind.
Gast
#1627562
blup schrieb: > ja. Je nach Compiler wird der Wert von i direkt erhöht. Das hat zur > Folge, dass der Zugriff auf Array[i] gleich beim ersten mal auf Array{1] > zeigt, statt wie gewollt auf Array[0]. Ein solcher Compiler wäre aber ziemlich kaputt. i++ und ++i unterscheiden sich einzig durch ihren Rückgabewert, der in der for-Schleife oben überhaupt nicht ausgewertet wird, also darf da nichts untersschiedliches rauskommen. > Bin vor paar Jahren während ner Studienarbeit drüber gestäupert und sehr > sehr kange gesucht :) War das wirklich genau diese Situation?
Gast
#1627564
> Pikanterweise geht der Rat an alle, die sowohl C als auch C++ > programmieren, der Version ++i den Vorzug zu geben :-) In C++ klar, aber bei C habe ich diesen Rat noch nie gehört, denn da kann man sich ja gar keinen eigenen Operator++ basteln. Auch in C++ bietet es seltener einen Vorteil, als die meisten denken. Die häufigsten Anwendungsfälle für den benutzerdefinierten Operator++ sind wohl Iteratoren und Smart-Pointer. Beide sind in der Regel als Templates ausgeführt, wodurch sie eigentlich immer im Header implementiert sind. Prima für's inlining von Operator++ und Kopierkonstruktor. Die sind zudem meist sehr einfach gestrickt. Das sind ideale Voraussetzungen für die Optimierung. Rolf Magnus schrieb: >> Pikanterweise geht der Rat an alle, die sowohl C als auch C++ >> programmieren, der Version ++i den Vorzug zu geben :-) > > In C++ klar, aber bei C habe ich diesen Rat noch nie gehört, denn da > kann man sich ja gar keinen eigenen Operator++ basteln. Es geht darum, sich einfach daran zu gewöhnen, automatisch immer die prefäx Version zu benutzen. Für reine C Programmierer ist das nicht relevant, wie du richtig anmerkst, und wie ich hoffte das es aus dem Satzteil "die sowohl C als auch C++ programmieren" hervorgeht.
Gast
#1627878
Karl heinz Buchegger schrieb: > Für reine C Programmierer ist das nicht relevant, wie du richtig > anmerkst, und wie ich hoffte das es aus dem Satzteil "die sowohl C als > auch C++ programmieren" hervorgeht. An sich geht das daraus hervor. Ich hab's aber trotzdem geschafft, es mißzuverstehen als "sowohl alle C-Programmierer, als auch alle C++-Programmierer".
Gast
#1628007
Und wieder was dazu gelernt. Es war wohl tatsächlich das wegoptimieren. Es war ein struct- oder Objekt-Pointer (so genau weiß ichs nicht mehr). Habe gerade noch mal ne Testdatei geschrieben, das Verhalten ist identisch, wie hier bereits erläutert. :) Somit entschuldige ich mich für die falsche Behauptung und danke für die neue Erkenntnis. Dann kann ich also wieder ruhig auf die präfix-Notation wechseln, die mir alleine schon optisch lieber ist. MfG aus Stuttgart Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|