Rechnen in C++?

5 Antworten

>> und << sind Verschiebungsoperatoren, die eine bitweise Verschiebung bewirken. Aber da diese eine recht niedrige Priorität in der Operatorrangfolge haben, wird zunächst einmal die Division n/2 durchgeführt.

Für n = 4 erhält man n/2 = 4/2 = 2.

Nun wird als nächstes (da weiter links stehend) die Rechtsverschiebung >> durchgeführt. Bei n >> 2 wird das durch n gegebene Bitmuster um 2 stellen nach rechts verschoben. Die binäre Darstellung der Ganzzahl n = 4 ist... [Hier mit 2 Byte bzw. 16 bit dargestellt, obwohl int in C++ je nach Compiler und System heute üblicherweise eher 4 Byte lang sind.]

00000000 00000100

Bei der Verschiebung um 2 Stellen nach rechts wander die 1 um 2 Stellen nach rechts und ist nun an der Einer-Position.

00000000 00000001

Die entsprechende Ganzzahl ist 1. Dementsprechend ist also n >> 2 hier 1. Nun wird durch die Linksverschiebung um 4 Stellen nach links (wegen << n mit n = 4) die 1 im Bitmuster um 4 Stellen nach links verschoben. [Der Rest bleibt einfach alles 0 und ist uninteressant.]

00000000 00010000

Die 1 befindet sich nun an der 2⁴-Position. Man erhält die Zahl 1 ⋅ 2⁴, also 16, als Ergebnis.

Ergebnis: 16

Weitere Informationen zu den Verschiebungsoperatoren << und >> findest du beispielsweise hier: https://learn.microsoft.com/de-de/cpp/cpp/left-shift-and-right-shift-operators-input-and-output?view=msvc-170


Hamsty28393 
Beitragsersteller
 30.06.2023, 20:09

Wie kommt man auf die Binärdarstellung?

0
mihisu  30.06.2023, 20:32
@Hamsty28393

Hmm. Schwierig wenn du das frägst, weil ich nicht ganz weiß auf welchem Niveau ich dich da abholen muss. Ich versuch mal auf einem recht niedrigen Niveau anzufangen.

============

Du kennst doch das Dezimalsystem, das im Alltag heutzutage von den meisten Personen benutzt wird, oder?

Da hat die Zahl 476 beispielsweise folgende Darstellung...

476₁₀ = 4 ⋅ 10² + 7 ⋅ 10¹ + 6 ⋅ 10⁰ = 4 ⋅ 100 + 7 ⋅ 10 + 6 ⋅ 1 = 476

[Die Zahl hat 4 Hunderter und 7 Zehner und 6 Einer.]

Soweit so gut, oder? Sowas ist quasi Grundschulstoff.

============

Nun ist es aber so, dass es in der Elektrotechnik einfacher ist 2 verschiedene Zustände (Strom fließt bzw. Spannung liegt an einerseits, kein Strom fließt bzw. keine Spannung andererseits) zu unterscheiden, als dass man 10 verschiedene Zustände als Grundlage nimmt. Dementsprechend arbeiten Computer im Grunde mit einem Binärsystem (mit 0 und 1) statt mit einem Dezimalsystem (mit 0, 1, 2, 3, 4, 5, 6, 7, 8, 9).

Analog zum Dezimalsystem kann man nun Zahlen darstellen. Die Binärzahl 100110 würde beispielsweise der Zahl 38 entsprechen. Denn...

100110₂ = 1 ⋅ 2⁵ + 0 ⋅ 2⁴ + 0 ⋅ 2³ + 1 ⋅ 2² + 1 ⋅ 2¹ + 0 ⋅ 2⁰
= 1 ⋅ 32 + 0 ⋅ 16 + 0 ⋅ 8 + 1 ⋅ 4 + 1 ⋅ 2 + 0 ⋅ 1
= 32 + 4 + 2 = 38

[Die Zahl hat 1 32er und 0 16er und 0 8er und 1 4er und 1 2er und 0 1er.]

------------

Nun kann man sich umgekehrt fragen. Welche Binärdarstellung hat beispielsweise die Dezimalzahl 4? Naja, da 4 eine 2er-Potenz ist, nämlich 4 = 2² ist das ganze recht einfach. Die Zahl hat eine 1 an der 4er-Stelle (2²er-Stelle) und sonst nur 0er.

4 = 2² = 1 ⋅ 2² + 0 ⋅ 2¹ + 0 ⋅ 2⁰ = 100₂

Bzw. kann man die Binärzahl 100₂ nun noch mit führenden 0ern ergänzen, die nichts am eigentlichen Wert ändern, aber die Zahl so darstellen, dass sie eine gewisse Anzahl an Stellen aufweist (beispielsweise 16 Stellen bei einer 16-bit-Darstellung)...

4 = 100₂ = 0000000000000100₂

============

Ich hoffe das war einigermaßen verständlich. Ansonsten frag nochmal nach. Aber eigentlich ist das auch Stoff, der in der Unterstufe im Mathematikunterricht behandeln worden sein sollte.

Eine allgemeinere Umrechnungsmethode vom Dezimalsystem ins Binärsystem ist beispielsweise auch hier dargestellt:

https://de.wikipedia.org/wiki/Dualsystem#Vom_Dezimalsystem_ins_Dualsystem

[Wiederholte Division durch 2 mit Rest und dann betrachten der Reste.]

2

>> und << verschieben Bits einer Binärzahl. Die Zahl deren Bits verschoben wird kommt vor das Zeichen. Die Anzahl der Stellen, um die verschoben wird, kommt nach das Zeichen. Im dem Code werden zwei Operationen aneinandergereiht.

n = 4 und n/2 = 2. Setzt man das ein, steht da also

4 >> 2 << 4

4 als Binärzahl ist 100. Verschoben um zwei Stellen nach rechts kommt 1 raus. Zwischenergebnis:

1 << 4

1 ist dezimal und binär das gleiche. Verschoben um 4 Stellen nach links kommt 10000 raus. Das ist als Dezimalzahl 16.

<< und >> sind Bitverschiebeoperatoren. Da sie eine absurd niedrige Priorität haben, wird zuerst n/2 = 2 ausgerechnet.

Dann folgt (von links nach rechts)

n >> n/2 = 4 >> 2 = 1

und 1 << n = 1 << 4 = 16.


Hamsty28393 
Beitragsersteller
 30.06.2023, 19:43

Kannst du mir erklären warum gilt 4>>2=1 und 1<<n=1

0
tunik123  30.06.2023, 19:47
@Hamsty28393

4 ist im Dualsystem 100, das um 2 Bit nach rechts verschoben ist 1.

1 << n = 16

Die 1 um n (also 4) Bit linksverschoben ist 10000, das ist 16.

0

<< und >> ist das Shiften, also Verschieben von Bits, wobei ein Shift um 1 Stelle einer Multiplikation mit 2 resp. einer Division durch 2 entspricht - insofern ist es komisch, daß man das n/2 nicht auch als Shift umgesetzt hat.

Wichtig ist noch zu wissen, daß Shifts gleiche Präzedenz haben unf von links nach rechts ausgewertet werden, während die Division eine höhere Präzedenz hat, also zuerst ausgeführt wird.

n=4
n>>n/2<<n (erst Division)
n>>2<<n
4>>2<<4 ( (4/2)/2=1 )
1<<4  (entspricht 1*2^4)
16

Einmal rechts schieben hat den gleichen Effekt wie Teilen durch 2, einmal links schieben den gleichen wie Multiplikation mit 2.

die 4 schiebst du erst 4/2 mal nach rechts, also 2 mal, was zwei mal Teilen durch 2 entspricht: 4 / 2 / 2, resultierend in 1.

Danach schiebst du die erhaltene 1 vier mal nach links, entsprechend 1 * 2 * 2 * 2 * 2, ergebend 16.