Kann XOR zweier Ganzzahlen außerhalb der Grenzen liegen?

Lesezeit: 11 Minuten

Benutzeravatar von Expert Novice
Experte Novize

Ich hatte den Algorithmus zum Auffinden einsamer Ganzzahlen in einem Array studiert, und hier ist die Implementierung:

int arr[] = {10, 20, 30, 5, 20, 10, 30};
int LonelyInteger = 0;
for(int i=0; i< 7; i++)
{
    LonelyInteger = LonelyInteger ^ arr[i];
}

Das Ergebnis ist 5.

Meine Frage ist – angeblich die ganzen Zahlen (die von der XOR Betrieb) sind zu groß aufgrund dieser Operation:

LonelyInteger ^ arr[i]

Was zu einer potenziell großen Ganzzahl führt, die beispielsweise nicht durch den Datentyp dargestellt werden kann int in diesem Fall. Meine Fragen sind:

  1. Ist das überhaupt möglich XOR generiert einen so großen ganzzahligen Wert, der nicht in gespeichert werden kann int Typ?
  2. Wenn es nicht möglich ist, dass dies passieren kann, gibt es dann einen Beweis dafür?

  • XOR ist eine bitweise Operation. Es erzeugt keine ganzen Zahlen, es erzeugt Bitmuster. Das Ergebnis ist logischerweise entweder eine Trap-Darstellung oder eine Nicht-Trap-Darstellung eines Werts. Es ist nicht möglich, ein “zu großes” Ergebnis zu erhalten, da das “zu große” Ergebnis nicht darstellbar wäre.

    – davmac

    4. Februar 2015 um 12:12 Uhr

  • x^y kann größer sein als max(x, y)so dass Sie in dieser Hinsicht eine “große ganze Zahl” für eine Definition von “groß” erhalten können.

    – Harald

    4. Februar 2015 um 12:41 Uhr

  • @RasmiRanjanNayak: Nein, dieser Algorithmus “findet” keine einsamen ganzen Zahlen. Es ist nur Vorschlag ist LonelyInteger != 0 → there is a lonely value (Beachten Sie, es ist kein wie aus dem Beispiel ersichtlich ist {1,2,3})

    – Bergi

    4. Februar 2015 um 15:59 Uhr


  • @Bergi: Wenn es nur eine einsame Ganzzahl gibt, ergibt sich dieser Wert. Wenn es Vielfache gibt, haben Sie Recht, dass die einzige Information ist, ob es ! = 0 ist

    – Muhende Ente

    4. Februar 2015 um 18:17 Uhr

  • @harold x^y <= x+y < 2*max(x,y) , Sie können also kein Bit höher setzen, als es bereits in einem der beiden Operanden gesetzt war. Beispiel: 128^127 = 255, was immer noch eine 8-Bit-Größe ist.

    – smci

    5. Februar 2015 um 8:21 Uhr


Benutzeravatar von schnaader
schnaader

XOR wird niemals die Grenzen überschreiten, da es Bits kombiniert und keine neuen Bits erzeugt, wo zuvor keine Bits gesetzt wurden.

Das Ergebnis 5 ist richtig. Betrachten Sie die binäre Darstellung Ihres Wertes und die XOR Ergebnis

10    00001010
20    00010100
30    00011110
 5    00000101
20    00010100
10    00001010
30    00011110
--------------
      00000101 => 5

Eine einfache Hilfe zur Berechnung eines Ergebnisses aus vielen XORed-Werte ist: Das Ergebnis hat ein gesetztes Bit, wenn eine ungerade Anzahl von Bits kombiniert wird, kein gesetztes Bit für eine gerade Anzahl von Bits.

Wenn es nicht möglich ist, dass dies passieren kann, gibt es dann einen Beweis dafür?

XOR entspricht einer Addition ohne Übertrag auf die einzelnen Bits. Wenn Sie Bits ohne Übertrag hinzufügen, kann kein Überlauf auftreten und so weiter int Wert kann nicht außerhalb der Grenzen liegen.

  • Aber haben wir dafür ausreichende Garantien? int ist binär? Dass das Maximum int bei einer Grenze von passiert 2^n-1 für einige n?

    – Yakk – Adam Nevraumont

    6. Februar 2015 um 16:17 Uhr

  • Hier geht es um bitweises XOR, also ist es natürlich binär. Wenn dies nicht der Fall wäre, müssten wir ein nicht-bitweises xor (nicht binär) definieren.

    – Assembly_Wizard

    10. Februar 2015 um 22:02 Uhr

  • @ThatWeirdo Binarität von XOR wurde hier nie bestritten, aber die Binarität von ints. Was ist, wenn sie zufällig im 9-Trit-Register eines ternären Computers gespeichert sind und der Maximalwert nicht kleiner als eine Zweierpotenz ist?

    – John Dvorak

    11. Februar 2015 um 0:33 Uhr


  • @JanDvorak: Wo hast du einen ternären Computer gesehen? Oder ist deine Frage nur theoretisch?

    – Bhaskar

    11. Februar 2015 um 10:05 Uhr

  • @JanDvorak: Was ist die Definition (oder Wahrheitstabelle) des XOR-Operators für ein ternäres System? Ich denke, selbst C und C++ wissen es nicht. Wenn ein ternärer Computer entworfen wird, muss meiner Meinung nach eine neue Programmiersprache von Grund auf neu erstellt werden.

    – Bhaskar

    12. Februar 2015 um 10:24 Uhr

Benutzeravatar von Mike Seymour
Mike Seymour

Das Ergebnis kann niemals “zu groß” in dem Sinne sein, dass seine Darstellung mehr Bits erfordert als int liefert, da die Operation so definiert ist, dass sie Bitwerte ihrer Operanden kombiniert, keine neuen Bits. Vielleicht wäre eine bessere Frage, ob das Ergebnis etwas anderes als eine gültige Wertdarstellung von an sein kann int?

Für Ganzzahlen ohne Vorzeichen nein. Alle Bitmuster und damit das Ergebnis aller bitweisen Operationen sind gültige Wertdarstellungen.

Bei Ganzzahlen mit Vorzeichen hängt dies von der implementierungsdefinierten Darstellung negativer Werte ab. Jede Implementierung, der Sie wahrscheinlich begegnen werden, verwendet Zweierkomplemente, in denen wiederum jedes Bitmuster gültig ist; Das Ergebnis jeder bitweisen Operation ist also wieder eine gültige Darstellung.

Der Standard erlaubt aber auch andere Darstellungen, bei denen ein oder mehrere ungültige Bitmuster vorkommen können. In diesem Fall ist es möglich, dass eine bitweise Operation mit zwei gültigen Operanden dieses Muster und damit ein ungültiges Ergebnis erzeugt.

  • Führt dieses ungültige Ergebnis zu undefiniertem Verhalten?

    – Ruslan

    4. Februar 2015 um 18:59 Uhr

  • @Ruslan: Für C++ würde ich ja sagen; Der Standard sagt nicht viel darüber aus, welche vorzeichenbehafteten Werte gültig sind und was im Falle ungültiger passiert, daher scheint das Verhalten nicht definiert zu sein. Ich kann nicht für C sprechen.

    – Mike Seymour

    5. Februar 2015 um 11:42 Uhr

Benutzeravatar von MM
MM

(Dieser Beitrag gilt für C, nicht C++)

Die bitweisen Operatoren können keine Trap-Darstellung durch das Setzen ungültiger Füllbits verursachen, siehe C11 6.2.6.2/1 Fußnote:

…keine arithmetische Operation auf gültige Werte kann eine Trap-Darstellung erzeugen…

(Die Bedeutung von “arithmetische Operation” ist unklar, aber der Index verweist auf 6.5.11, was die Definition von XOR ist).

In C können sie jedoch a verursachen negative Null zu generieren. Im Zweierkomplement gibt es keine negative Null. Aber sagen Sie, Sie wären auf einem System mit 1er-Komplement, dann könnten Sie eine negative Null via erzeugen ^ und dies könnte eine Trap-Darstellung verursachen. 6.2.6.2/3 sagt ausdrücklich, dass dies möglich ist:

Wenn die Implementierung negative Nullen unterstützt, dürfen sie nur generiert werden durch:

— die Operatoren &, |, ^, ~, << und >> mit Operanden, die einen solchen Wert erzeugen;

Schließlich impliziert 6.2.6.2/2 (ich bin mir sowieso ziemlich sicher), dass es nicht möglich ist, eine Kombination von Wertbits zu haben, die eine Ganzzahlüberschreitung darstellen würde INT_MAX


Zusammenfassend sind die möglichen Ergebnisse von ^ auf zwei ints sind:

  • Ein weiterer gültiger int Wert (möglicherweise mit anderen, aber nicht abfangenden Füllbits zu anderen Versionen desselben Werts)
  • Eine negative Null, die eine Falle verursachen kann oder nicht

  • In C++ sagt es nicht wirklich, was passiert, wenn negative Null erzeugt wird, soweit ich sehen kann

    – MM

    4. Februar 2015 um 12:22 Uhr

  • nit: Der C-Standard lässt zu, dass alle Bits Null sind, außer dem Vorzeichenbit, um das Zweierkomplement abzufangen (d. h. INT_MIN vielleicht -INT_MAX und INT_MAX ^ -1 nicht definiert). Ich kenne zwar Beispiele für Nicht-2er-Komplement-Maschinen, aber ich weiß nicht, ob eine solche 2er-Komplement-Implementierung existiert (vielleicht ist sie nur im Standard enthalten, weil sie den Programmierer normalerweise nicht belastet).

    – Mafso

    4. Februar 2015 um 14:06 Uhr

  • @mafso: Ich glaube, einige Implementierungen von Zweierkomplementen definieren INT_MIN als -32767, um jegliche Verpflichtung zu vermeiden, einige Eckfälle mit Dingen wie printf, Division usw. zu behandeln. Zum Beispiel auf einer Maschine, die nur eine signierte Rechtsverschiebung hat Operation könnte die Auswertung von n/4, wenn n negativ ist, -(-n)>>2 berechnen. Wenn n = -32767, würde das -8191 ergeben, aber wenn n = -32768, würde es 8192 ergeben. Wenn INT_MIN -32767 ist, wäre die Berechnung von (-32768)/4 ein undefiniertes Verhalten, also wäre es perfekt, wenn es 8192 ergeben würde legitim.

    – Superkatze

    4. Februar 2015 um 18:37 Uhr


  • @mafso: Obwohl ich keine Hardware kenne, die -INT_MAX-1 entweder als Falle oder als NaN betrachtet, gibt es sicherlich Zeiten, in denen ein NaN nützlich wäre (in der Lage zu sein, nachträglich zu testen, ob ein Überlauf bei aufgetreten ist Jede Stufe in einer Berechnung könnte wahrscheinlich effizienter sein, als den Code in jeder Stufe auf Überläufe prüfen und abfangen zu müssen, insbesondere auf Systemen, die eine Ausführung außerhalb der Reihenfolge unterstützen). Ich bin mir nicht sicher, ob solche Hardware das Henne-Ei-Problem lösen könnte, aber ich hätte nichts dagegen, so etwas zur Verfügung zu haben.

    – Superkatze

    4. Februar 2015 um 18:44 Uhr

  • Die nächsten Wörter nach Ihrem Zitat sind “außer als Teil einer außergewöhnlichen Bedingung wie einem Überlauf, und dies kann bei unsignierten Typen nicht auftreten”. – Erzeugen eines Wertes mit dem Vorzeichenbit 1 und allen anderen Bits 0 (d.h -INT_MAX-1 auf einem Zweierkomplementsystem), auf einem System, das dies als Trap-Darstellung definiert, durchaus als Überlauf angesehen werden.

    – Random832

    5. Februar 2015 um 18:33 Uhr


Genau genommen können Sie zwei Ganzzahlen nicht XORn. Sie können zwei Beutel mit Bits in ganzzahliger Größe XOR-verknüpfen, und Sie können diese Beutel mit Bits zu anderen Zeiten als ganze Zahlen behandeln. Sie können sie sogar als ganze Zahlen behandeln alle anderen Zeiten.

Aber in dem Moment, in dem Sie die XOR-Operation ausführen, behandeln Sie sie als etwas ganz anderes als ganze Zahlen oder sogar Zahlen. an sich: Sie sind nur zwei Bitfolgen, bei denen entsprechende Bits verglichen werden. Das Konzept des Überlaufs trifft darauf nicht zu, und wenn Sie sich dann entscheiden, das Ergebnis als Ganzzahl zu behandeln, kann es auch nicht überlaufen.

Benutzeravatar von eerorika
Erorika

Ist es überhaupt möglich, dass XOR einen so großen ganzzahligen Wert generiert, der nicht im int-Typ gespeichert werden kann?

Wenn die Operanden sind intdann nein.

Wenn es nicht möglich ist, dass dies passieren kann, gibt es dann einen Beweis dafür?

Nun, es ist von der Definition her trivial. Dies ist kaum ein mathematisch strenger Beweis, aber Sie könnten bedenken, dass ein Bit in der Ausgabe von XOR nur dann 1 ist, wenn einer der Operanden 1 an dieser Position hat. Da ein Bereichsüberschreitungsbit in den Operanden nicht 1 sein kann, gibt es kein Ausgangsbit mit dem Wert 1, das außerhalb des Bereichs liegt.

  • Only if the operands are negative. Wie?

    – Experte Anfänger

    4. Februar 2015 um 12:13 Uhr

  • @ExpertNovice Weil (unter der Annahme des 2er-Komplements) das signifikanteste Bit negativer Zahlen ist 1. Und es ist 0 für positive Zahlen. Wenn beide Operanden negativ sind, dann folgt daraus, dass beide ihr höchstwertiges Bit sind 1. 1 XOR 1 ist 0. Daher ist das höchstwertige Bit von XOR zwei negative Zahlen 0 dh die ganze Zahl ist positiv. Positive Zahlen sind größer als negative.

    – Erorika

    4. Februar 2015 um 12:16 Uhr


  • Ich nehme das zurück, weil nur negative Operanden ein größeres Ergebnis haben. XOR von positiven Zahlen kann auch größer als Operanden sein. Aber nicht größer als in die Anzahl der Bits von Operanden passt. Ich habe die Implikation rückwärts verstanden. Das Ergebnis ist immer größer, wenn beide Operanden negativ sind, aber das ist nicht der einzige Fall eines größeren Ergebnisses. Mein Fehler.

    – Erorika

    4. Februar 2015 um 12:49 Uhr


  • Rechts, 1 ^ 4 ist 5 das ist größer als entweder – aber die höchstes Bit gesetzt nimmt nicht zu. Und die Repräsentationsfähigkeit 4 impliziert die Fähigkeit zur Repräsentation 5, 6und 7 auch (C99 6.2.6.2)

    – Hobbs

    5. Februar 2015 um 19:00 Uhr


XOR, AND, OR, NOT und alle anderen bitweisen Operatoren erzeugen bitweise Ergebnisse, wobei die Bits im Ergebnis aus den Bits an genau derselben Position in den Eingängen kombiniert werden. n-Bit-Eingänge erzeugen also n-Bit ohne höheres Bit. Wie kann es also außerhalb der Grenzen liegen?

  • Only if the operands are negative. Wie?

    – Experte Anfänger

    4. Februar 2015 um 12:13 Uhr

  • @ExpertNovice Weil (unter der Annahme des 2er-Komplements) das signifikanteste Bit negativer Zahlen ist 1. Und es ist 0 für positive Zahlen. Wenn beide Operanden negativ sind, dann folgt daraus, dass beide ihr höchstwertiges Bit sind 1. 1 XOR 1 ist 0. Daher ist das höchstwertige Bit von XOR zwei negative Zahlen 0 dh die ganze Zahl ist positiv. Positive Zahlen sind größer als negative.

    – Erorika

    4. Februar 2015 um 12:16 Uhr


  • Ich nehme das zurück, weil nur negative Operanden ein größeres Ergebnis haben. XOR von positiven Zahlen kann auch größer als Operanden sein. Aber nicht größer als in die Anzahl der Bits von Operanden passt. Ich habe die Implikation rückwärts verstanden. Das Ergebnis ist immer größer, wenn beide Operanden negativ sind, aber das ist nicht der einzige Fall eines größeren Ergebnisses. Mein Fehler.

    – Erorika

    4. Februar 2015 um 12:49 Uhr


  • Rechts, 1 ^ 4 ist 5 das ist größer als entweder – aber die höchstes Bit gesetzt nimmt nicht zu. Und die Repräsentationsfähigkeit 4 impliziert die Fähigkeit zur Repräsentation 5, 6und 7 auch (C99 6.2.6.2)

    – Hobbs

    5. Februar 2015 um 19:00 Uhr


Nein, ich kann nicht. Im Gegensatz zu anderen Antworten wäre meine ein mathematischer Beweis.

XOR ist Abkürzung für Exklusiv oder oder exklusive Disjunktion () und kann wie folgt definiert werden:

A ⊕ B = (A ∪ B)\(A ∩ B)

Ihr Vorschlag ist das

∃x: x ∉ A ∧ x ∉ B ∧ x ∈ (A ⊕ B)

Also aus der ersten Gleichung

x ∈ (A ∪ B)\(A ∩ B)

Was kann ausgedrückt werden als

x ∈ (A ∪ B) ∧ x ∉ (A ∩ B)

Der zweite Teil kann wie folgt ausgedrückt werden:

x ∉ A ∧ x ∉ B

Der erste Teil kann wie folgt ausgedrückt werden:

x ∈ A ∨ x ∈ B

Was kollidieren mit unserer Annahme, dass x ∉ A ∧ x ∉ B also ist die Proposition für jede Menge falsch A und B.

QED

1412120cookie-checkKann XOR zweier Ganzzahlen außerhalb der Grenzen liegen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy