Die Logische Verknüpfung:



  • kann jemand das erklären? : die Umkehrung von XOR.
    In der Programmiersprache C gibt es XOR nur als Bit-Operator, nicht aber als logischen Operator.
    Das Symbol dafür ist ^. Das bitweise XOR wird insbesondere für Verschlüsselungs- und
    Prüfsummenoperationen eingesetzt, denn eine interessante Besonderheit der XOR-Operation
    besteht darin, dass ihre Umkehrung wieder eine XOR-Operation ist – es gilt:
    A XOR B = C⇔(C XOR A = 😎 ∧ (C XOR B = A)
    Eine wichtige Beispielanwendung ist die Berechnung der Prüfsumme (Parity) in bestimmten
    RAID-Arrays. Es handelt sich um eine Zusammenfassung mehrerer Festplatten, die einer
    Steigerung der Performance und/oder Datensicherheit insbesondere bei Serversystemen
    dient (siehe Kapitel 3, »Hardware«). RAID 3, 4 und 5 verknüpfen dabei zwei oder mehr gleich
    lange Bit-Folgen mit einer XOR-Operation. Wenn eine der beteiligten Festplatten versagt,
    lässt sich somit aus der umgekehrten XOR-Operation mit der intakten Folge beziehungsweise
    den intakten Folgen einerseits und der Prüfsumme andererseits die defekte Folge rekonstruieren.



  • Wahrheitstabelle für XOR:

    A = 0b1100
    B = 0b1010
    
    Z = A xor B
    0 = 0 xor 0
    1 = 0 xor 1
    1 = 1 xor 0
    0 = 1 xor 1
    

    für boolsche Werte:

    A = false (0)
    B = false (0)
    
    Z = A xor B
    0 = 0 xor 0 (false = false ^ false)
    
    
    A = false (0)
    B = true  (1)
    
    Z = A xor B
    1 = 0 xor 1 (true = false ^ true)
    
    
    A = true  (1)
    B = false (0)
    
    Z = A xor B
    1 = 1 xor 0 (true = true ^ false)
    
    
    A = true  (1)
    B = true  (1)
    
    Z = A xor B
    0 = 1 xor 1 (false = true ^ true)
    

    Erklärung von Dennis Ritchie:

    zu @ziad38 sagte in Die Logische Verknüpfung::

    In der Programmiersprache C gibt es XOR nur als Bit-Operator, nicht aber als logischen Operator.

    From: Dennis Ritchie <dmr@bell-labs.com>
    Newsgroups: comp.std.c
    Subject: Re: logical exclusive OR


    XOR im Bezug auf RAID:

    In einfachen Worten sagt Dir XOR ob die Anzahl der gesetzten Bits an einer Stelle zweier Werte ungerade ist (1) oder nicht (0):

    ?0?? xor ?0?? ... Anzahl der gesetzten Bits an dieser Stelle: 0, also   gerade, gibt ?0??
    ?0?? xor ?1?? ... Anzahl der gesetzten Bits an dieser Stelle: 1, also ungerade, gibt ?1??
    ?1?? xor ?0?? ... Anzahl der gesetzten Bits an dieser Stelle: 1, gibt ungerade, gibt ?1??
    ?1?? xor ?1?? ... Anzahl der gesetzten Bits an dieser Stelle: 2, also   gerade, gibt ?0??
    

    Hat man nun auf Disk 1 ein Byte 11001001 und auf Disk 2 ein Byte 01100101 ergibt das als Parity

        11001001 (Disk 1)
    xor 01100101 (Disk 2)
    ------------
        10101100 (Parity)
    

    Kackt nun Disk 2 ab und man hat nur noch Disk 1 und Parity so lässt sich dieses Byte von Disk 2 rekonstruieren weil einem die Parity sagt, ob die Zahl der gesetzten Bits an einer bestimmten Position ungerade oder gerade war:

        11001001 (Disk 1)
    xor 10101100 (Parity)
    ------------
        01100101 (Disk 2)
    

    In Langform (Bit 0 = Least Significant Bit (LSB), Bit 7 = Most Significant Bit (MSB)):

    Für Bit 0 des Bytes der verlorenen Disk 2 sagt Parity, daß Disk 1 und 2 zusammen eine gerade Anzahl an gesetzten Bits hatten (Parity: 0). Da Bit 0 des Bytes von Disk 1 gesetzt ist muss das Bit 0 im Byte von Disk 2 auch gesetzt gewesen sein um auf eine gerade Anzahl zu kommen.

    Für Bit 1 des Bytes der Disk 2 sagt Parity, daß Disk 1 und 2 zusammen eine gerade Anzahl an gesetzten Bits hatten (Parity: 0). Da Bit 1 des Bytes von Disk 1 nicht gesetzt ist kann das Bit im Byte von Disk 2 auch nicht gesetzt gewesen sein da sich sonst eine ungerade Anzahl an Bits an dieser Position gesetzt gewesen wäre.

    Für Bit 2 des Bytes der Disk 2 sagt Parity, daß Disk 1 und 2 zusammen eine ungerade Anzahl an gesetzten Bits hatten (Parity: 1). Da Bit 1 des Bytes von Disk 1 nicht gesetzt ist muss das Bit 2 in diesem Byte von Disk 2 gesetzt gewesen sein um auf eine ungerade Zahl gesetzter Bits an dieser Position zu kommen.

    usw.

    Langer Rede kurzer Unsinn:
    Hat man eine Information darüber wie viele Bits an der selben Positionen zweier Werte gesetzt sind kann man das auch rekonstruieren.

    Bit gesetzt in Disk 1, Disk 2 = ??? und Parity == 1?
    gibt nur eine Lösung.
    Entsprechend auch für alle anderen Möglichkeiten von Parity und Disk 1.


    Wer ohne Google (oder eine andere Suchmaschine ^^) zu bemühen weiß woher der Wert des Bytes auf Disk 1 kommt bekommt 'ne kleine Fanta ohne Eis.



  • @ziad38 sagte in Die Logische Verknüpfung::

    In der Programmiersprache C gibt es XOR nur als Bit-Operator, nicht aber als logischen Operator.

    Doch. Das ist der != Operator



  • @DirkB Gegeben daß beide Operanden boolsche Werte sind (und wir von Zeh reden):

    (!!A) ^ (!!B)

    und Du hast Dein logisches XOR.

    //edit: oder

    (!!A) != (!!B)

    das ist dann Wurst. (//edit: obs mal Boolsche Werte waren).



  • naja aber das exklusiv-oder liefert immer dann den wert "wahr", wenn a und b verschieden (antivalent) sind, und das ist bei != doch der fall, oder nicht?



  • @Wade1234 Wenn jemand nach einem "logischen XOR" fragt will es wahrscheinlich daß alle operanden ungleich 0 true (1) sind.



  • @Swordfish welchen definitions- bzw. wertebereich hat die boolesche algebra? 🤨



  • @Wade1234 {0, 1}?



  • @Swordfish dann sollte man werte wie 4 doch tunlichst vermeiden, weil diese ein falsches ergebnis liefern, oder? 😃



  • @Wade1234 Dafür sind die hübschen Rrrrufzeichen oben in meinem Post.



  • @Swordfish ja aber wenn "int WerteMeineAussageAus()" plötzlich 12345 zurückliefert, obwohl der wertebereich ja nur {0, 1} ist, stimmt da doch schon etwas grundsätzliches nicht, oder?



  • @Wade1234 Hast Du schon einmal

    char *foo = whatever;
    if (foo) ...
    

    geschrieben?



  • @Swordfish also ich weiß natürlich, dass das geht, aber ich finde das nicht schön. also

    char *foo = whatever;
    if(foo != NULL) //oder if(foo != nullptr)
    

    finde ich irgendwie besser. aber eigentlich ist das ein wertevergleich und keine logische äquivalenz.



  • @Wade1234 sagte in Die Logische Verknüpfung::

    aber wenn "int WerteMeineAussageAus()" plötzlich 12345 zurückliefert, obwohl der wertebereich ja nur {0, 1} ist, stimmt da doch schon etwas grundsätzliches nicht, oder?

    Die Definition von "true" ist im aktuellen C-Draft an vielen Stellen (zurecht) immer noch "nonzero". Auch zB für die character classification functions in <ctype.h>. Sind die dann jetzt kaput?



  • @Wade1234
    Wenn != logisches XOR ist, dann ist auch ^ logisches XOR, und & ist logisches UND.
    Ist aber nicht so 🙂



  • Man könnte diesbetreffend auch über Sequence Points und Auswertungsreihenfolge philosophieren ^^



  • @Swordfish sagte in Die Logische Verknüpfung::

    @Wade1234 sagte in Die Logische Verknüpfung::

    aber wenn "int WerteMeineAussageAus()" plötzlich 12345 zurückliefert, obwohl der wertebereich ja nur {0, 1} ist, stimmt da doch schon etwas grundsätzliches nicht, oder?

    Die Definition von "true" ist im aktuellen C-Draft an vielen Stellen (zurecht) immer noch "nonzero". Auch zB für die character classification functions in <ctype.h>. Sind die dann jetzt kaput?

    nein das nicht, aber man sollte für logische verknüpfungen einfach bei 0 und 1 bleiben.

    @hustbaer

    != | B | A | Q
    -------------------
       | 0 | 0 | 0
       | 0 | 1 | 1
       | 1 | 0 | 1
       | 1 | 1 | 0
    

    passt doch.



  • @Wade1234 sagte in Die Logische Verknüpfung::

    nein das nicht, aber man sollte für logische verknüpfungen einfach bei 0 und 1 bleiben.

    Deswegen die schönen Rufzeichen 😉

    @Wade1234 sagte in Die Logische Verknüpfung::

    passt doch.

    Ja. Aber wie gesagt nur wenn Du vorher sicherstellst daß die Operanden nur Bool'sche Werte haben.



  • @Wade1234 Die in C++ als logische Operatoren bezeichneten Operatoren konvertieren alle ihre Inputs erstmal nach bool. != macht das nicht. Daher passt != nicht in die Liste.

    Klar, wenn es schon bools sind, dann kann man != verwenden. Nur dann kann man halt auch genau so gut ^ verwenden.

    Und wenn ich die Wahl zwischen den beiden habe, dann wähle ich einfach den der für mich "passender klingt". Und wenn ich jmd. etwas mit dem Begriff "xor" erklären würde, dann nehme ich ^ und wenn ich es mit dem Begriff "ungleich" erklären würde dann nehme ich !=.

    Und aus diesen Gründen macht es für mich keinen Sinn != als logischen XOR Operator zu bezeichnen.



  • @ziad38 sagte in Die Logische Verknüpfung::

    Es geht um c sprache. ich meine diese Umkehrung für A XOR B , habe nicht verstannden, aber ich weiss was XOR bedeutet, es geht nur um die Umkeherung: leider kann ich kein Bild schicke , sonst mache ich ein Bild vom Text vom meinem Buch und versteht ihr beser was ich meine.

    A XOR B = C⇔(C XOR A = ) ∧ (C XOR B = A)??


Log in to reply