Wie heißt der "<<" Operator in c++ bzw. was macht er?

Nilson

Grand Admiral
Registriert
Dez. 2008
Beiträge
25.692
Hallo,

Ich arbeite normal nur mit C oder C#, mit C++ hatte ich bisher noch nicht viel zu tun. Jetzt hab ich aber ein C++ Projekt hier, dass ich weiterführen soll. Im Grunde kein Problem, nur eine Frage kam auf, was ist/macht der "<<" Operator? Google hat die dämliche Angewohnheit << zu ignorieren, wenn man es eintippt. Und bei "Preil" oder "Arrow" kommt nur was zu dem Pointer-Pfeil "->".

Das man damit Bits schieben kann ist mir klar, also sowas: a =<< 3, Dann wird a um drei Stellen geschoben.

Konkret geht es um folgende Zeile(n)

Code:
DMASend.writeReg(MM2S_DMACR,0x1+(1<<12));

Die Funktion die Aufgerufen wird ist

Code:
void writeReg(unsigned int Offset, unsigned int Value) {...}

Was macht also das
Code:
0x1+(1<<12)
?

Bei cout und so kommt er auch vor, da reit er die Strings aneinander
 
Zuletzt bearbeitet:
Bits verschieben in einer Variablen, links oder rechts. Such mal nach Bit Shifiting oder Bits verschieben o.ä.
 
Heißt:
Code:
0x1+(1<<12) = 0x1001
?
Also Hex 1 plus "1 um 12 verschoben"
 
Wie RED-Bit schon anmerkte, ist das der Bit-Shift-Operator. Man benutzt ihn, um Bits zu verschieben. ;)

Außer natürlich in Zusammenhang mit ostreams ... hier ist die Bedeutung des Operator auf "Schieb den Output (rechtsseitiger Operand) mal in diesen Stream hier (linksseitiger Operand)" umdefiniert worden:

std::cout << "Das hier landet im Output-Stream.\n";
 
<< kann wie jeder Operator überladen werden, weshalb seine Funktion je nach Datentyp stark variiert, wie du ja auch schon selbst festgestellt hast. Bei Integern ist es ein Bit-Shift (streng genommen muss man bei signed-Typen noch auf das Vorzeichenbit aufpassen). Das häufig verwendete "1<<x" ist nichts weiter als eine im Binärsystem verschobene 1, mit anderen Worten "2 hoch x".
 
Thx, wieder etwas schlauer
 
0x1 in Hex == 1 in Dezimal
0x1 + (1<<12) == 1+4096

1 Shift left 12 mal ist: 1*2*2*2*2*2*2*2*2*2*2*2*2 = 4096 = 2^12

Code:
DMASend.writeReg(MM2S_DMACR, 4097);

Zumindest bei unsigned int. Bei signed gilt das Zweierkomplement, d.h. das erste Bit zeigt ob es eine positive oder negative Zahl ist. Ich würde die Finger davon lassen, solche Sachen optimiert der Compiler und wandelt deine Rechnungen möglichst effizient um.
 
Zuletzt bearbeitet:
black90 schrieb:
Ich würde die Finger davon lassen, solche Sachen optimiert der Compiler und wandelt deine Rechnungen möglichst effizient um.

Jain, bei Konstanten wie hier stimme ich da voll zu. Der Compiler wird das schon richtig optimieren und außerdem sind solche Sachen auch immer sehr träge zu lesen was ich z.B. ebenfalls schlecht finde.
Allerdings können solche Shiftoperationen Sinnn machen, wenn ich um eine beliebige Variabel shifte, die der Compiler nicht vorhersagen und somit optimieren kann.
 
Eine Integermultiplikation ist heutzutage so billig, dass sich solch Tweaks nurnoch sehr sehr selten lohnen.
Das typische Einsatzgebiet ist eher die Erzeugung von Bitmasken.
 
Zurück
Oben