2017-02-12 1 views
1

Ich muss zwei Variablen ohne XOR und arithmetische Operationen austauschen. Alle ich verwenden können, sind bitweise Operationen wie ~, &, |, < <, >> usw.Bitweises Tauschen ohne XOR

ich die XOR-Ansatz verstehen, kann aber nicht den anderen Weg, um dieses herauszufinden ..

BEARBEITEN: Temporäre Variablen sind auch nicht erlaubt.

+0

also kannst du xor (^) durch eine Kombination von &, | ersetzen und ~? – Fallen

+0

@Fallen, Ja, ich denke ich kann. Ich habe mich gefragt, ob es einen grundlegend anderen Ansatz gibt, nicht nur das Ersetzen von XOR durch grundlegendere Operatoren und das erneute Verwenden von XOR-Austausch. Vielleicht etwas, das Verschiebungen oder neuere Kombinationen von Operatoren erlaubt. – parsecer

Antwort

2

Da XOR is a combination of ANDs and NOTs, alles, was Sie tun müssen, ist es in Java Implementierung:

static int nand(int a, int b) { 
    return ~(a & b); 
} 

static int xor(int a, int b) { 
    return nand(nand(a, nand(a, b)), nand(b, nand(a, b))); 
} 

Mit dieser Implementierung vorhanden ist, können Sie swap using XOR.

+1

Aber darfst du eine temporäre Variable verwenden? Ich meine, wenn du das könntest, könntest du sie einfach direkt tauschen. –

+0

Also, wenn Sie die temporäre Variable aus dieser Antwort nehmen, sind Sie mit Rückkehr nand (nand (a, nand (a, b)), nand (b, nand (a, b))); '. –

+1

@DM Das ist nur für die Bequemlichkeit - man kann 'nab' durch einen Aufruf von' nand (a, b) 'an beiden Stellen, an denen es verwendet wird, ersetzen und damit erledigt werden. Offensichtlich ist es auch egal, denn es ist eine Lernübung, die den Schülern vermittelt, dass XOR mit anderen Operationen modelliert werden kann. – dasblinkenlight

1

Wie im answer of dasblinkenlight gezeigt ist, kann ein mit xornand emuliert werden, und von notand besteht. Analog kann die xor mit nor, bestehend aus not und or emuliert werden.

Die Ausdrücke ein wenig komplex am Ende aussehen ...

public class XorTest 
{ 
    public static void main(String[] args) 
    { 
     testNand(); 
     testNor(); 
    } 

    private static void testNand() 
    { 
     int a = 1234; 
     int b = 5678; 

     a = xorNand(a, b); 
     b = xorNand(b, a); 
     a = xorNand(a, b); 

     System.out.println(a); 
     System.out.println(b); 
    } 

    private static void testNor() 
    { 
     int a = 1234; 
     int b = 5678; 

     a = xorNor(a, b); 
     b = xorNor(b, a); 
     a = xorNor(a, b); 

     System.out.println(a); 
     System.out.println(b); 
    } 

    private static int xorNand(int a, int b) 
    { 
     return ~(~(a & ~(a & b)) & ~(b & ~(a & b))); 
    } 

    static int xorNor(int a, int b) 
    { 
     return ~(~(~(a | a) | ~(b | b)) | ~(a | b)); 
    } 
} 

Aber ich kann von einer Art und Weise nicht denken, dass das gleiche tut „nur“ mit Verschiebungen oder anderen „neuen Kombinationen von Operatoren“ - was auch immer das bedeuten soll, genau ...