Bitweise Operatoren

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Bitweise UND, also & ist ein Operator bei binären Rechenoperationen,
während logisches UND bei bool'schen Ausdrücken zum Einsatz kommt.
Klartext: Mit '&' werden zwei Zahlen miteinander UND-Verknüpft, bei &&
werden zwei Bedingungen zu einer zusammengefasst.
  • logisches UND, &&
    WENN name="Bob" && alter>18 DANN TUE...
    d.h. Die Bedingung ist nur dann erfüllt, wenn beide Teilbedingungen zutreffen.
  • binäres UND, &
    a = 00101101
    b = 01100110
    a & b = 00100100
    d.h. Die Bits, die bei beiden Zahlen 1 sind, werden übernommen, Rest auf 0 gesetzt.
 

Eli

Mitglied
ok, wobei wie ließt java dann sowas wie 3... von links nach recht oder umgedreht? (also x*2^0 + x*2^1 + ..) oder ( x*2^3 +x*2^2+...)
 
G

Guest

Gast
Jeder Operator hat eine bestimmte Priorität, so dass der Ausdruck mathematisch korrekt
berechnet wird. (Multiplikation vor Addition etc.)
Wenn Du unsicher bist, dann kannst Du zusätzlich Klammern setzen, was oft allein schon
wegen der besseren Lesbarkeit von Vorteil ist.
z.B. (obwohl völlig unnötig)
(x*2^0) + (x*2^1) + ...

Auf die Programmausführung hat es keinen Einfluß, ist aber übersichtlicher als z.B.
x*2^0+x*2^1+...

Übrigens, verwechsle ^ nicht mit "x hoch y"!!!
^ ist XOR (exklusives ODER; math. Antivalenz)
z.B.

int a = 2^5; // Ergebnis ist 7 und nicht 32

2 = 00000010
5 = 00000101
7 = 00000111

"x hoch y" kriegst Du über Math.pow(x, y); also Math.pow(2, 5) im Beispiel.
 
G

Guest

Gast
Noch etwas zur Ergänzung, damit keine Missverständnisse aufkommen.
Ich schrieb: Auf die Programmausführung hat es keinen Einfluß...
Gilt selbstverständlich nur in diesem Beispiel, sonst bestimmt Klammerung die Reihenfolge
der zu berechnenden Teilausdrücke.

'(a * b) + c' ist nicht das gleiche wie 'a * (b + c)'
 

0xdeadbeef

Top Contributor
IMHO ist die ursprüngliche Frage falsch bzw. unklar gestellt und keiner ist bislang darauf eingegangen. In C/C++ ist das "&" binär und das "&&" logisch. In Java ist allerdings auch "&" für boolean überladen!

Will heißen:
Im Fall " a && b " ist "&&" ein Kurzschlußoperator. Es wird Bedingung a geprüft, wenn sie false ist, wird b gar nicht mehr ausgewertet.
Im Fall " a & b " wird b ausgewertet, unabhängig davon, welchen Wert a hat.

Wichtig ist dieser Unterschied, wenn der Ausdruck "b" z.B. ein Funktionsaufruf ist, der im Fall des Kurzschlußoperators u.U. nicht ausgeführt ist.
 
G

Guest

Gast
@0xdeadbeef
Ich dachte das wäre hier ein Java-Forum, daher erzähle ich nicht von
anderen Programmiersprachen.
 

0xdeadbeef

Top Contributor
Mach Dir nochmal die Mühe und lese mein Posting genau durch. Dann darfst Dur Dir Asche aufs Haupt streuen :roll:
 
G

Guest

Gast
OK, OK, nicht aufregen. ;) Deine Antwort stimmt ja.
In Java ist allerdings auch "&" für boolean überladen!
Du meinst sicherlich das hier?
Code:
public class Test {
  public static boolean a() {
    System.out.println("a() aufgerufen");
    return false;
  }
  
  public static boolean b() {
    System.out.println("b() aufgerufen");
    return true;
  }

  public static void main(String[] args) {
    System.out.println("Kurzschlußoperator &&");
    if(a() && b());
    System.out.println("Binäroperator &");
    if(a() & b());
  }
}
 

0xdeadbeef

Top Contributor
Genau. Nur würde ich es hier nicht als "binären" Operator bezeichnen, denn es ist in diesem Kontext genauso ein logischer Operator wie "&&" nur mit dem feinen Unterschied, daß es eben kein Kurzschlußoperator ist, also immer alle Operanden ausgewertet werden.

BTW: Einen Operator als "binär" zu bezeichnen, ist eh heikel, weil man als "binäre Operatoren" normalerweise Operatoren bezeichnet, die zwei Operanden haben (im Unterschied zu unären Operatoren wie "++"). In diesem Sinn sind "&" und "&&" genauso binär wie "*" und "/" usw. Aber das nur am Rande...
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben