Implementar Função Swap em C
- Use a variável temporária para implementar a função de troca em C
- Use operações aritméticas para implementar a função de troca em C
- Use a operação bit a bit XOR para implementar a função de troca em C
- Use operação XOR bit a bit e macros para implementar a função de troca em C
Este artigo irá explicar vários métodos de como implementar a função de troca em C.
Use a variável temporária para implementar a função de troca em C
A função de troca é uma operação típica para conduzir em variáveis. Não existe uma função de biblioteca padrão C que forneça o recurso como C++ tem a função std::swap
. Neste artigo, implementamos funções de troca para valores integrais; a saber, a maioria deles aceita argumentos de tipo long int
, mas sempre é possível definir vários protótipos para diferentes tipos e garantir recursos genéricos usando expansões de macro. O exemplo a seguir demonstra a função de troca usando a variável temporária. Observe que, embora seja a implementação mais fácil, esta é relativamente a versão mais rápida entre outras listadas abaixo (quando as otimizações do compilador são usadas).
#include <stdio.h>
#include <stdlib.h>
void swap(long *x, long *y) {
long tmp = *x;
*x = *y;
*y = tmp;
}
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: ./program first_number second_number/n");
return 1;
}
long x = strtol(argv[1], NULL, 0);
long y = strtol(argv[2], NULL, 0);
printf("x:%ld, y:%ld\n", x, y);
if (x != y) swap(&x, &y);
printf("x:%ld, y:%ld\n\n", x, y);
exit(EXIT_SUCCESS);
}
Comando de amostra:
./program 123 432
Resultado:
x:123, y:432
x:432, y:123
Use operações aritméticas para implementar a função de troca em C
Alternativamente, pode-se implementar uma função de troca usando apenas operações de adição e subtração. Operamos ponteiros passados na função, modificando os valores dos argumentos diretamente. Na função main
, existe uma condição if
antes da função swap
ser chamada para evitar a chamada quando os operandos são iguais.
#include <stdio.h>
#include <stdlib.h>
void swap(long *x, long *y) {
*x = *x + *y;
*y = *x - *y;
*x = *x - *y;
}
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: ./program first_number second_number/n");
return 1;
}
long x = strtol(argv[1], NULL, 0);
long y = strtol(argv[2], NULL, 0);
printf("x:%ld, y:%ld\n", x, y);
if (x != y) swap(&x, &y);
printf("x:%ld, y:%ld\n\n", x, y);
exit(EXIT_SUCCESS);
}
Use a operação bit a bit XOR para implementar a função de troca em C
A implementação mais complicada e um pouco complicada da função de troca é onde a operação XOR bit a bit é usada. Observe que esta versão não precisa de uma terceira variável como o exemplo anterior. A princípio, armazenamos o resultado XOR-ed dos inteiros fornecidos em um de seus locais. Então, XOR o valor armazenado (y
) com o outro inteiro e armazenamos o resultado no lugar deste último. Finalmente, ambas as variáveis são XOR-ed mais uma vez, e o resultado é armazenado na primeira variável modificada - y
neste caso. Esta implementação envolve mais instruções de código de máquina quando compiladas sem sinalizadores de otimização, portanto, produz uma solução mais intensiva de computação.
#include <stdio.h>
#include <stdlib.h>
void swap(long *x, long *y) {
*y = *x ^ *y;
*x = *x ^ *y;
*y = *x ^ *y;
}
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: ./program first_number second_number/n");
return 1;
}
long x = strtol(argv[1], NULL, 0);
long y = strtol(argv[2], NULL, 0);
printf("x:%ld, y:%ld\n", x, y);
if (x != y) swap(&x, &y);
printf("x:%ld, y:%ld\n\n", x, y);
exit(EXIT_SUCCESS);
}
Use operação XOR bit a bit e macros para implementar a função de troca em C
Conforme demonstrado no exemplo anterior, a função de troca XOR também pode ser implementada como uma macro semelhante a uma função. Observe que é necessário verificar se os dois operandos são o mesmo objeto; caso contrário, a macro atribui zero ao objeto, o que resulta na saída incorreta. Esta verificação é implementada usando ?:
Condicional, e só então executamos o algoritmo de troca XOR semelhante à implementação anterior. Lembre-se, porém, de que esta macro semelhante a uma função só pode processar valores integrais.
#include <stdio.h>
#include <stdlib.h>
#define XORSWAP(a, b) \
((&(a) == &(b)) ? (a) : ((a) ^= (b), (b) ^= (a), (a) ^= (b)))
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: ./program first_number second_number/n");
return 1;
}
long x = strtol(argv[1], NULL, 0);
long y = strtol(argv[2], NULL, 0);
printf("x:%ld, y:%ld\n", x, y);
XORSWAP(x, y);
printf("x:%ld, y:%ld\n", x, y);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook