2017-02-12 32 views
1

我需要交換兩個變量,而不需要XOR和算術運算。 所有我可以使用的位運算就好〜,&,|,< <,>>等無XOR的按位交換

我明白了XOR的方法,但不能找出解決這個問題的另一種方式..

編輯:臨時變量也不允許。

+0

所以你可以用&,|替換異或(^)和〜? – Fallen

+0

@Fallen,是的,我想我可以。我想知道是否有一個根本不同的方法,不僅僅是將更多的XOR與更多的基本操作符進行替換,並且再次使用XOR交換。也許是允許轉變或更新穎的運營商組合的東西。 – parsecer

回答

2

由於XOR is a combination of ANDs and NOTs,所有你需要做的是在Java中實現它:

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))); 
} 

有了這個執行到位,你可以swap using XOR

+1

但是你可以使用臨時變量嗎?我的意思是,如果你能做到這一點,你可以直接交換它們。 –

+0

所以,如果你從這個答案中拿出臨時變量,你就剩下'return nand(nand(a,nand(a,b)),nand(b,nand(a,b)));'。 –

+1

@DM這只是爲了方便 - 可以在使用它的兩個地方用'nand(a,b)'調用來替換'nab',並且用它來完成。顯然,無論如何,這並不重要,因爲這是一個學習練習,旨在教授學生XOR可以與其他操作建模。 – dasblinkenlight

1

answer of dasblinkenlight所示,xor可以與nand來模擬,包括notand。類似地,可以使用nor來模擬xor,其由notor組成。

的表情看起來有點複雜,到底...

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)); 
    } 
} 

但我不能想辦法,做同樣的「唯一」與移位或其他「運營商的新組合」 - 無論這應該是什麼意思,完全...