Was macht der Operator "^=" in diesem Algorithmus für die Suche nach nicht gepaarten Zahlen? [Duplikat]

8

Ich habe ein interessantes Stück Code gesehen, um eine einsame Nummer in einer Liste von doppelten Nummern zu finden (wobei jede Nummer in der Liste zweimal vorkommt, mit Ausnahme von einer).

%Vor%

Diese Lösung sieht sehr elegant aus, aber ich bin neugierig darauf, was der ^= Operator hier eigentlich macht?

    
Cumulo Nimbus 24.05.2017, 17:09
quelle

2 Antworten

19

a ^= b ist das gleiche wie a = a ^ b , wobei ^ der bitweise XOR-Operator ist.

%Vor%

Dies ist ein ordentlicher Algorithmus. Lassen Sie uns eine Ausführung mit der Liste [8, 12, 8] verfolgen, zum Beispiel:

%Vor%

Das Wort "duplizieren" ist nicht korrekt. Dieser Algorithmus testet auf Parität . Eine einfache, aber etwas falsche Definition ist "wenn alles ein Paar hat ". Paar ... Parität.

[2,2,2,3,3,5,5,5,5] gibt 2 zurück, weil alles andere ein Paar hat.

[3,4,5] wird tatsächlich 2 ( 011^100^101 - & gt; 010 ) zurückgeben, da dies der xor aller ungepaarten Elemente ist.

    
Joe Frambach 24.05.2017, 17:10
quelle
4

Wie andere Antworten sagen - es ist ein bitweises XOR.

Über den Algorithmus - es ist cool, wenn Sie sicher sind, dass die Duplikate auch zählen. Wenn eine Zahl mit x XOR-ediert wird und später wieder mit x XOR-ediert wird, kehrt sie zu ihrem vorherigen Wert zurück. Wenn eine Zahl 3 mal in dieser Kette gesehen wird, täuscht das 3. Auftreten diesen Algorithmus. Auch wenn es einen weiteren Wert in der Kette gibt, wie zB:

%Vor%

Das Ergebnis ist (X ^ Y) und Sie können nicht sicher sein, ob Sie einen eindeutigen Wert oder mehr haben.

    
Todor Simeonov 24.05.2017 17:15
quelle