unterschied zwischen & und && und bedeutung von ~

  • hallo,
    ich habe in einem in java implementierten rot13 verschlüsselungsalgorithmus die verwendung von & und ~ gesehen und wollte euch fragen ob ihr wissts wann man das verwendet.


    auszug aus dem code:


    PHP
    while((abyte = System.in.read())>=0){
    
          int cap = abyte & 32;
          abyte &= ~cap;
          abyte = ((abyte >= 'A') && (abyte <= 'Z') ? ((abyte - 'A' + 13) % 26 + 'A') : abyte) | cap;
          System.out.print(String.valueOf((char)abyte));
        }

    vielen dank für eure hilfe!

  • Naja, &&, ||, ^^, ! sind boole'sche Operatoren, die nehmen ein bzw. zwei Argumente (in Java müssen die, soviel ich weiß, vom Typ bool sein, in C können das beliebige Zahlen sein, wobei 0 für logisch falsch und alles andere für logisch wahr steht) und liefern als Ergebnis wahr oder falsch (True und False in java, 0 und 1 in C).


    &, |, ^ und ~ sind bitweise Operatoren. Betrachtet werden die einzelnen Bits des/der Operanden:


    10 & 11 = 10, 10 & 10 = 10, ...
    10 | 11 = 11, 10 | 10 = 10, ...
    10 | 11 = 01, 10 | 10 = 00, ...
    ~10 = 01
    ~11 = 00


    Wobei das alles Zahlen in Binärdarstellung sind. Beim Komplement ist dann noch zu beachten, dass natürlich alle Stellen, die im Operanden 0 sind, im Ergebnis auf 1 gesetzt werden (also auch die führenden Nullen).

  • & und | können auch in boolschen Ausdrücken verwendet werden. Der Unterschied zwischen && und & ist, dass & immer beide Operanden betrachtet, während && nur den ersten anschaut, falls sich dadurch das Endergebnis bereits eindeutig ermitteln lässt (nämlich wenn der 1. falsch ist, dann wird der 2. gar nicht mehr angeschaut). Das nennt man Kurzschlussoperator und ist dann wichtig, wenn die Auswertung des Ausdrucks Seiteneffekte hat. Analoges gilt für | und ||.

  • & und | können auch in boolschen Ausdrücken verwendet werden. Der Unterschied zwischen && und & ist, dass & immer beide Operanden betrachtet, während && nur den ersten anschaut, falls sich dadurch das Endergebnis bereits eindeutig ermitteln lässt (nämlich wenn der 1. falsch ist, dann wird der 2. gar nicht mehr angeschaut). Das nennt man Kurzschlussoperator und ist dann wichtig, wenn die Auswertung des Ausdrucks Seiteneffekte hat. Analoges gilt für | und ||.

    Wobei - zumindest in C - & und && nicht immer das gleiche Ergebnis liefern: 0x10 & 0x01 == 0 <=> false; 0x10 && 0x01 <=> true && true == true

    Why bother spending time reading up on things? Everybody's an authority, in a free land.

  • ....in C können das beliebige Zahlen sein, wobei 0 für logisch falsch und 1 für logisch wahr steht)

    um ganz genau zu sein ist '0' "false", alles andere "true". zumindest der gcc siehts so.

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  • Wobei - zumindest in C - & und && nicht immer das gleiche Ergebnis liefern: 0x10 & 0x01 == 0 <=> false; 0x10 && 0x01 <=> true && true == true


    Ja, in C. Das ist auch klar, weil da & die bitweise Verknüpfung ist und jeder beliebige Integerwert auch als boolscher Wert interpretiert werden kann, nachdem false einfach als 0 und true als != 0 (bei Verwendung der Konstanten true ist es -1) interpretiert wird. 0x10 & 0x01 ergibt somit false.


    Java erkennt aber ob es sich um boolsche Ausdrücke handelt und wählt zwischen dem bitweisen und dem boolschen Operator. 0x10 & 0x01 in einer Bedingung müsste in Java wenn ich mich jetzt nicht irre zu einem Compilerfehler führen weil es kein boolscher Ausdruck ist.

  • @true in C: im C99-Standard ist festgelegt, dass "true" zu "1" expandiert.


    @Compilerfehler in Java: Ja, der Compiler wirft einen Fehler. Meine Anmerkung war auch so gedacht, dass es hier eben einen erheblichen Unterschied zwischen C und Java gibt, den man im Auge behalten sollte, wenn man zwischen den Sprachen wechselt.

    Why bother spending time reading up on things? Everybody's an authority, in a free land.

  • Natürlich. Ich habe mich auf das Posting von Christoph R. bzw. das Makro "true" bezogen, wie es in <stdbool.h> definiert wird. Überall sonst im Standard ist nur von "nonzero" oder "unequal 0" die Rede.

    Why bother spending time reading up on things? Everybody's an authority, in a free land.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!