Also habe ich nur ein bisschen Manipulation in C ++ versucht. Folgendes habe ich versucht:
int a = 1<<2;
cout<<a;
Dies ergibt die Ausgabe als 4
.
int a = 1<<3;
cout<<a;
Dies ergibt die Ausgabe als 8
Aber wenn ich es mache:
int a = 1<<2 + 1<<3;
cout<<a;
Es gibt die Ausgabe als 64
. Warum so?
Ich habe auch versucht:
int a = 1<<2;
int b = 1<<3;
cout<<a + b;
Welches gibt die Ausgabe 12
wie erwartet.
c++
bit-manipulation
Ron Howard
quelle
quelle
<<
hat eine niedrigere Priorität als+
,1<<2 + 1<<3
=1<<(2 + 1)<<3
1<<2 + 1<<3
es wirklich ist1<< 2+1 <<3
. Lassen Sie sich nicht von Leerzeichen irreführen.Antworten:
Dies liegt daran, dass die Addition eine höhere Operatorpriorität als die Bitverschiebung hat. Mit anderen Worten, Ihr zweites Beispiel entspricht
1 << (2 + 1) << 3
Da Bitshifting linksassoziativ ist, ist es außerdem dasselbe wie
(1 << (2 + 1)) << 3
. Dies vereinfacht sich8 << 3
, was ist64
.quelle
Es geht um die Priorität des Operators
+
Daher hat eine höhere Priorität als Shift - Operatoren,1<<2 + 1<<3
erfolgte wie1 << (2 + 1) << 3
die ähnlich1 << 6 == 64
(da<<
ist linksassoziativ , wie Sie oben in der Tabelle Vorrang in dem Link zu sehen)Das ist auch der Grund
cout<<a + b;
, warum es funktioniert, weil es als analysiertcout<<(a + b);
wird. Andernfalls werden einige Fehler angezeigt, z. B. "Kann einem Stream keine Nummer hinzufügen".quelle
Der
+
Operator hat eine höhere Priorität als der<<
Operator. Daher wird diese Zeile hier ausgewertet:Sie sollten es so in Klammern gruppieren:
quelle