Unverständliche Lösung

03/23/2017 12:55 FunkyJustice#1
Hallo,

ich hoffe, ich befinde mich im richtigen Foren-Abteil.

Ich habe vorkurzem eine "Code" Zeile gesehen, die für mich komplett unverständlich war. Kann mir jemand diese vielleicht erklären?

Code:
int a = 2 | 1 | 6 & 12;
Das Ergebnis ist 7, aber warum? Ich habe leider kein anderes Beispiel gefunden.

(Entschuldigt bitte meine Frage, ich bin noch ziemlicher Anfänger :x)
03/23/2017 13:12 Jeoni#2
Das sind alles Bit-Operationen. Ich unterstelle mal, du weißt, was der OR- und der AND-Operator prinzipiell tun. Stellen wir die Zahlen also mal kurz als Binärdarstellung dar:
2 = 0010
1 = 0001
6 = 0110
12 = 1100
Nun schauen wir uns an, was in welcher Reihenfolge gemacht wird. Hierzu ziehen wir die [Only registered and activated users can see links. Click Here To Register...] zurate: Wir sehen, dass AND (&) vor OR (|) ausgeführt wird.
Also wird erst "6 & 12" ausgeführt: 6 & 12 = 0110 & 1100 = 0100 = 4
Jetzt werden die ORs ausgeführt ('4' ist das Ergebnis von "6 & 12"): 2 | 1 | 4 = 0010 | 0001 | 0100 = 0111 = 7
Mit freundlichen Grüßen
Jeoni
03/23/2017 13:23 qqdev#3
Zuerst müssen wir erkennen, dass die Operatoren rechts vom Gleichheitszeichen allesamt bitweise Operatoren sind (das erkennt man daran, dass es immer nur ein | oder & ist). D.h. wir betrachten nun die binären Darstellungen der Zahlen.
Darüberhinaus müssen wir beachten, dass manche Operationen vor anderen Operationen ausgeführt werden müssen. Das ist so wie in der Mathematik (Punkt vor Strich). Laut dem Internet hat das & Vorrang vor dem | ([Only registered and activated users can see links. Click Here To Register...]).

Wie kommt man nun auf die 7?

2 entspricht = 0010 (binär)
1 entspricht = 0001 (binär)
6 entspricht = 0110 (binär)
12 entspricht = 1100 (binär)

2 | 1 (| ist das binäre OR, d.h. wenn ein oder beide bits 1 sind, dann ist das Ergebnisbit eine 1, sonst 0)

0010 | 0001 = 0011

6 & 12 (& ist das binäre AND, d.h. wenn beide bits 1 sind, dann ist das Ergebnisbit eine 1, sonst 0)

0110 & 1100 = 0100

Und nun:

0011 | 0100 = 0111

Wobei 0111 einer dezimalen 7 entspricht.


Gruß,
qqdev