2017-02-12 14 views
1

Мне нужно обменивать две переменные без операций XOR и арифметических операций. Все, что я могу использовать это битовые операции, как ~, & |, < <, >> и т.д.Побитовый обмен без XOR

Я понимаю XOR подход, но не могу понять другой способ обойти это ..

EDIT: Временные переменные также не допускаются.

+0

так что вы можете заменить xor (^) комбинацией &, | и ~? – 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 Это просто для удобства - можно заменить 'nab' вызовом' nand (a, b) 'в обоих местах, где он используется, и сделать с ним. Очевидно, это не имеет никакого значения, поскольку это учебное упражнение, предназначенное для обучения студентов тому, что XOR можно смоделировать с помощью других операций. – dasblinkenlight

1

Как показано на answer of dasblinkenlight, xor можно эмулировать с nand, состоящий из not и and. Аналогично, xor можно эмулировать с помощью nor, состоящего из not и or.

выражение будет выглядеть немного сложное, в конце концов ...

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

Но я не могу придумать способ, который делает то же самое «только» с изменениями или другими «новыми комбинациями операторов» - что бы это ни значило, точно ...

 Смежные вопросы

  • Нет связанных вопросов^_^