Operatoren Bitoperatoren

Saheeda

Top Contributor
Hallo,

ich habe mich heute mal etwas genauer mit den Bitoperatoren beschäftigt und bin nicht ganz sicher, ob ich das alles richtig verstanden habe:

(a | b) vs. (a || b)
| = inclusive or = mindestens einer der Ausdrücke muss richtig sein.
Bei | werden sämtliche Ausdrücke durchgegangen, bei || wird abgebrochen, sobald ein korrekter Ausdruck gefunden wurde.
Analog (a & b vs. a && b).
&& und || werden bei Stackoverflow als "short-circuits" bezeichnet.


Aber ich tu mich noch schwer damit zu verstehen, wie z.B. hier:
Java:
int a = 1 | 2;
boolean b = false | true;
derselbe Operator einmal eine Zahl und einmal einen boolean zurückgeben kann. Ich weiß prinzipiell, wie ich zwei Bytes über 'oder' oder 'und' verknüpfe, aber hier tu ich mich schwer.
Meine Erklärung dafür wäre:
In beiden Fällen werden die Parameter in bits zerlegt und verknüpft. Beim ersten erkennt der Compiler, dass ich eine Zahl haben möchte und wandelt es entsprechend um. Beim zweiten merkt er, dass ich jetzt einen boolean bräuchte und wandelt es auch hier von selbst um.
Aber diese Erklärung klingt für mich irgendwie n bisschen krude :-/

Bitshift verschiebt "einfach nur" alles um die angegebene Anzahl von Bits nach links oder rechts. Google meint dazu, dass so zu rechnen schneller wäre, als eine normale Division oder Multiplikation.
Stimmt das noch? Oder sind heute die Rechner so schnell, dass es im Normalfall keine signifikanten Auswirkungen hat?
 

Tobse

Top Contributor
Deine Vermutung lag schon ziemlich nahe :)

Wenn du zwei Zahlen mit Bitoperatoren verknüpfst, werden diese Operatoren auf die einzelnen Bits der Zahlen angewandt. Dabei gibt es kein || oder &&, weil es nie mehr als 2 Operatoren gibt.

Beispiel: 3 | 5 = 0011 | 0101 = 0111 = 7
Beispiel: 3 & 5 = 0011 | 0101 = 0001 = 1

EDIT: P.S.: Die Operatoren |, ||, &, && und ^ mit booleans arbeiten immer nur mit einem Bit pro Operation. Die Operatoren |, &, ~ und ^ mit Zahlen arbeiten immer mit mehreren Bits pro Operation (genau so viele, wie der Datentyp groß ist). Das Vorzeichen-Bit wird ist genauso von der Operation betroffen.

EDIT2: Habe deine letzte Frage erst jetzt gesehen, sorry :D

In Java ist das völlig egal. Mal einen "dummen" Compiler vorrausgesetzt wäre x << 1 schneller als x * 2 und x >> 1 schneller als x / 2. Aber der Java-Compiler ist äußerst intelligent; wenn du im Quellcode x * 2 schreibst, wird das automatisch zu x << 1 kompiliert.
Aber auch selbst wenn überall 1:1 compiliert würde, wäre der Unterschied auf den Modernen Computern in 90% aller Fälle nichtmal gut messbar. Um bei solchen kleinen Operationen einen Unterschied zu merken, muss man sie schon ein paar Milliarden mal ausführen (wobei einem auch dort Java-Compiler viel weg optimiert).
Auf einem 16-Bit Microprozessor und einem "dummen" C-Compiler wäre der Unterschied aber wahrscheinlich merkbar.
 
Zuletzt bearbeitet:

InfectedBytes

Top Contributor
Java:
int a = 1 | 2;
boolean b = false | true;
derselbe Operator einmal eine Zahl und einmal einen boolean zurückgeben kann. Ich weiß prinzipiell, wie ich zwei Bytes über 'oder' oder 'und' verknüpfe, aber hier tu ich mich schwer.
Meine Erklärung dafür wäre:
In beiden Fällen werden die Parameter in bits zerlegt und verknüpft. Beim ersten erkennt der Compiler, dass ich eine Zahl haben möchte und wandelt es entsprechend um. Beim zweiten merkt er, dass ich jetzt einen boolean bräuchte und wandelt es auch hier von selbst um.
Der Compiler merkt nicht das du eine Zahl haben willst, sondern erzeugt eine Zahl, da die Operanden Zahlen sind.
Ebenso gibt er einen Boolean zurück, wenn du booleans verknüpfst.
 

CSHW89

Bekanntes Mitglied
Und um den Gedanken von InfectedBytes weiterzuführen, würde das hier zu einem Compiler-Fehler führen:
Java:
int a = false & true;
Zu den Bitshifts: hin und wieder kam es mal vor, dass ich bei einem gegebenen 'i' eine Zahl mit '2^i' multiplizieren musste. Da dürfte es in der Tat einen Unterschied machen, ob du nun 'a*(int)Math.pow(2,i)' rechnest oder einfach 'a<<i', zumal ich bei 'pow' und Integern immer skeptisch bin, ob da nun vielleicht Genauigkeit verloren gegangen ist, und ich durchs Abrunden eine andere Zahl bekomme.

lg Kevin
 
Zuletzt bearbeitet:

Neue Themen


Oben