ti-enxame.com

Como trocar dois números sem usar variáveis ​​temporárias ou operações aritméticas?

Esta equação troca dois números sem uma variável temporária, mas usa operações aritméticas:

a = (a+b) - (b=a);

Como posso fazer isso sem operações aritméticas? Eu estava pensando no XOR.

31
mr_eclair
a=a+b;
b=a-b;
a=a-b;

Isso é simples, mas eficaz ...

21
sreejith k s

Por que não usar as bibliotecas std?

std::swap(a,b);
18
Martin York

Em C isso deve funcionar:

a = a^b;
b = a^b;
a = a^b;

OU um cooler/nerd olhando:

a^=b;
b^=a;
a^=b;

Para mais detalhes, veja em this . XOR é uma operação muito poderosa que tem muitos usos interessantes surgindo aqui e ali.

16
BiGYaN

A melhor maneira de trocar dois números sem usar armazenamento temporário ou operações aritméticas é carregar as duas variáveis ​​em registradores e depois usar os registradores ao contrário!

Você não pode fazer isso diretamente de C, mas o compilador é provavelmente capaz de desenvolvê-lo (pelo menos, se a otimização estiver ativada) - se você escrever um código simples e óbvio, como o que KennyTM sugeriu em seu comentário .

por exemplo.

void swap_tmp(unsigned int *p)
{
  unsigned int tmp;

  tmp = p[0];
  p[0] = p[1];
  p[1] = tmp;
}

compilado com o gcc 4.3.2 com o sinalizador de otimização -O2:

swap_tmp:
        pushl   %ebp               ;  (prologue)
        movl    %esp, %ebp         ;  (prologue)
        movl    8(%ebp), %eax      ; EAX = p
        movl    (%eax), %ecx       ; ECX = p[0]
        movl    4(%eax), %edx      ; EDX = p[1]
        movl    %ecx, 4(%eax)      ; p[1] = ECX
        movl    %edx, (%eax)       ; p[0] = EDX
        popl    %ebp               ;  (epilogue)
        ret                        ;  (epilogue)
14
Matthew Slattery

Eu não vi essa solução C antes, mas tenho certeza que alguém pensou nisso. E talvez tivesse mais autocontrole do que eu.

fprintf(fopen("temp.txt", "w"), "%d", a);
a = b;
fscanf(fopen("temp.txt", "r"), "%d", &b);

Nenhuma variável extra!

Funciona para mim, mas dependendo da implementação do stdio, você pode ter que fazer algo sobre o buffer de saída.

5
Thomas Padron-McCarthy

a = ((a = a + b) - (b = a - b));

4
Syed Raza Mehdi

Usando XOR,

void swap(int &a, int &b)
{
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}

Um forro com XOR,

void swap(int &a, int &b)
{
    a ^= b ^= a ^= b;
}

Esses métodos parecem estar limpos, porque eles não falham em nenhum caso de teste, mas novamente, já que (como no método 2) o valor da variável é modificado duas vezes dentro do mesmo ponto de sequência, diz-se que está tendo um comportamento indefinido declarado por ANSI C.

3
Shubham A.

Solução simples que eu lembro dos meus solteiros :-)

a = a+b-(b=a);

 Example

0
Reddy

Multiplicação e divisão também podem ser usadas. 

 int x = 10, y = 5;

 // Code to swap 'x' and 'y'
 x = x * y;  // x now becomes 50
 y = x / y;  // y becomes 10
 x = x / y;  // x becomes 5
0
Moiz Sajid

Além das soluções acima para um caso em que, se um dos valores estiver fora do intervalo para um inteiro com sinal, os valores das duas variáveis ​​podem ser trocados dessa maneira

a = a+b;
b=b-(-a);
a=b-a;
b=-(b);
0
Khushi