Anfängerfrage zu einigen Operanten



  • Hi!

    Ich verstehe den Sinn der Operatoren:

    &=
    |=
    ~
    |

    nicht. Nirgendwo werden diese Anhand eines Beispieles erkährt. Könntet ihr mir bitte einige Beispiele zeigen?

    thx
    da noob



  • a&=b; bedeutet a=a&b;
    a|=b; bedeutet a=a|b;
    ~ <- den gibt es nicht
    | bedeutet binär-oder und wird idr. benutzt um Flags zu setzen

    int fd=open(".config",O_RDWR | O_CREAT);
    

    hier wird das Flag O_RDWR und das Flag O_CREAT gesetzt

    http://info.baeumle.com/ansic/c04.html



  • // Die 2 hier sind gleich
    a &= b
    a = a & b
    
    // Die 2 hier sind gleich
    a |= b
    a = a | b
    

    Die einzigen beiden die du dann wirklich erklärt haben willst sind offenbar | und ~, diese beiden sind wie & ebenfalls bitweise Operatoren. Wenn du & bereits verstehst sind diese beiden auch sehr einfach. | ist das bitweise ODER. Und ~ ist der Einer-Kompläment-Operator

    Solltest du aber auch mit & bereits Probleme haben, melde dich nochmal, dann schreibe ich hier etwas mehr über Bit-Operatoren.

    Gibts dazu nichts ind er FAQ?

    MfG SideWinder



  • Ich kann mir nichts unter "bitweisen Operatoren" vorstellen. 😕



  • @kingruedi: ~ gibts imho schon?!

    //Example
    //
    //In the following example, the new value assigned to y is the one's complement //of the original unsigned short value:
    
    // Example of the one's complement operator
    unsigned short y = 0xAAAA;  // value of y is 0xAAAA
    y = ~y;                     // value of y is 0x5555
    

    MfG SideWinder



  • 0Das Problem liegt offenbar bei den bitweisen Operatoren. Nehmen wir mal einen char her. Der besteht der Einfachheit nur aus 8 Bits (=1 Byte):

    0100 0001 // Wäre zB die Darstellung von 'A' (= Ascii-Code 65) im Speicher
    

    Nun kannst du aber nicht nur den Character als ganzes ansprechen sondern auch einzelne Bits verändern.

    Nun können wir verschiedene Operatoren anwenden, die zwei einfachsten sind imho >> und <<, sie verschieben das Bitmuster nach rechts bzw. nach links:

    char ch = 'A'; // 0100 0001
    
    char test = ch << 1; // 1000 0010
    

    Hier werden alle Bits um eins nach rechts verschoben. Dabei wird das Muster allerdings nicht rotiert sondern von rechts werden Nullen eingefügt:

    char ch = 'A'; // 0100 0001
    
    char test = ch << 3; // 0000 1000
    

    Die drei binären bitweisen Opreatoren sind &, | und ^. Diese setzen nach folgendem Muster:

    // &
    1 & x = x
    0 & x = 0
    
    Wenn beide Bits 1 sind ist dieses Bit im Ergebnis 1, ansonsten 0.
    
    // |
    1 | x = 1
    0 | x = x
    
    Wenn zumindest 1 Bit 1 ist ist dieses Bit im Ergebnis 1, ansonsten 0.
    
    // ^
    
    Wenn _nur_ 1 Bit 1 ist ist dieses Bit im Ergebnis 1, ansonsten 0.
    

    Dazu ein Beispiel:

    char ch = 'A'; // 0100 0001
    
    // Ist Bit 7 gesetzt?
    if(ch & 64) // 64 = 0100 0000 -> nur Bit 7 also
    
    // Wird zu:
    // 0100 0001
    // 0100 0000
    // ---------
    // 0100 0000 = 64 = true (da größer 0)
    
    // Ist Bit 6 gesetzt?
    if(ch & 32) // 32 = 0010 0000 -> nur Bit 6 also
    
    // Wird zu:
    // 0100 0001
    // 0010 0000
    // ---------
    // 0000 0000 = 0 = false
    

    Sinn und Zweck ist es Speicher zu sparen - zB bei Flags. Wenn etwas nur 1 oder 0 sein kann (gesetzt oder nicht gesetzt) dann ist es platzsparender auch nur 1 Bit zu verwenden.

    Der ~-Operator ist ebenfalls unär und erzeugt das Einerkomplement einer Zahl:

    char ch = 'A'; // = 65 = 0100 0001
    char test = ~ch; // 1011 1110 = 190
    

    Alle Nullen werden also zu Einsen und umgekehrt.

    Wär mal was für die FAQ wenn dort noch nichts darüber steht!

    MfG SideWinder



  • wow danke =), wär doch was für die FAQ!



  • Vielleicht noch etwas zur Bezeichnung:
    I.d.R. wird bei Bits mit 0 angefangen zu zählen. Sidewinders Bit 7 bzw. 6 sind eigentlich Bit 6 bzw. 5.

    Der Operator ^ heisst imo Exklusives-Oder, Äquivalenz in Assembler ist xor.
    Wenn zwei Bits damit verglichen werden, liefert er genau dann true zurück, wenn entweder das eine oder das andere Bit 1 ist.

    Im Gegensatz dazu ist das normale Oder (|) ein "Oder-Auch".
    Es liefert genau dann true zurück, wenn von zwei verglichenen Bits das eine oder aber auch das andere 1 ist. Das impliziert, das beide Bits 1 sein können, im Gegensatz zum Exclusive Or.

    edit: Absätze eingefügt



  • ich hätte noch eine Frage, das hier reinpasst:

    was ist den nun der Unterschied zwischen

    if (ch & 64)
    

    und

    if (ch && 64)
    

    ?

    Ich bin mir nicht sicher, aber kann es das beim ersteren auch eine Schreibzugriff auf die Variable "ch" stattfindet, und beim letzeren nur der Vergleich?

    MfG
    x.r3ap3r.x



  • Das 1. is das bitweise, das 2. das logische UND.
    Was du beim ersten meinst, is der Zuweisungsoperator '&':

    scanf("%i", &variable);  // & als Zuweisungsoperator
    


  • long long double schrieb:

    Das 1. is das bitweise, das 2. das logische UND.

    Und damit ist schon der Unterschied zwischen beidem erklärt: & verknüpft jedes Bit der beiden Eingabewerte einzeln (siehe die Erklärungen von SideWinder), && fasst die Eingaben als Wahrheitswert auf (0=false, alles andere=true) und liefert die logische Kombination dieser Werte (d.h. es liefert 1 (für true) zurück, wenn beide Operanden ungleich 0 sind, andernfalls 0.

    Was du beim ersten meinst, is der Zuweisungsoperator '&'

    Das ist kein Zuweisungsoperator (Zuweisung ist immer noch =), sondern der Adress-Operator.



  • CStoll schrieb:

    long long double schrieb:

    Was du beim ersten meinst, is der Zuweisungsoperator '&'

    Das ist kein Zuweisungsoperator (Zuweisung ist immer noch =), sondern der Adress-Operator.

    Stimmt ja 🙄
    Das kann passieren, wenn man sich die posts nicht nochmal durchliest vorm absenden 😉



  • alles klar, dann macht die 2. if-anweisung kein sinn es sei denn man will wissen dass beide undgleich "0" ist oder nicht, richtig?

    und noch zum ersten, dann bleiben die vergleichsparameter auch unverändert, ist das auch richtig?



  • x.r3ap3r.x schrieb:

    alles klar, dann macht die 2. if-anweisung kein sinn es sei denn man will wissen dass beide undgleich "0" ist oder nicht, richtig?

    richtig. nur wenn beide != 0 sind, ist die 'if'-abfrage erfolgreich. wenn man das will, macht es schon sinn.

    x.r3ap3r.x schrieb:

    und noch zum ersten, dann bleiben die vergleichsparameter auch unverändert, ist das auch richtig?

    auch richtig. das ergebnis der &-verknüpfung wird nur temporär für den vergleich genutzt und danach weggeworfen...
    🙂


Anmelden zum Antworten