in

¿Hay una función de intercambio incorporada en C?

apple touch icon@2

Creo que se me ocurrió una función independiente de tipos para intercambiar dos valores cualesquiera en C estándar, aunque como soy bastante nuevo en el lenguaje, es posible que haya pasado por alto algo. Utiliza el algoritmo de intercambio XOR, y estoy seguro de que podría optimizarse más, pero funciona siempre que los dos valores apunten al mismo número de bytes, especificado por el tercer argumento:

void swapn(void *a, void *b, size_t n) {
    if (a == b) {
        return;
    }

    size_t i;
    char *x = (char *)a,
        *y = (char *)b;

    for (i = 0; i < n; i++) {
        *x ^= *y;
        *y ^= *x;
        *x ^= *y;
        x++;
        y++;
    }
}

Uso de ejemplo:

// swap two integers
int x = 5,
    y = 30;

printf("%dt%dn", x, y);

swapn(&x, &y, sizeof(int));

printf("%dt%dnn", x, y);

// swap two floats
float a = 9.23f,
    b = 6.83f;

printf("%.2ft%.2fn", a, b);

swapn(&a, &b, sizeof(float));

printf("%.2ft%.2fnn", a, b);

// swap two doubles
double p = 4.7539,
    q = 0.9841;

printf("%.4ft%.4fn", p, q);

swapn(&p, &q, sizeof(double));

printf("%.4ft%.4fnn", p, q);

// swap two chars
char m = 'M',
    n = 'n';

printf("%ct%cn", m, n);

swapn(&m, &n, sizeof(char));

printf("%ct%cnn", m, n);

// swap two strings of equivalent length
char s[] = "Hello",
    t[] = "World";

printf("%st%sn", s, t);

swapn(s, t, sizeof(s));

printf("%st%snn", s, t);

La salida es:

5   30
30  5

9.23    6.83
6.83    9.23

4.7539  0.9841
0.9841  4.7539

M   n
n   M

Hello   World
World   Hello

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

if statements

Groovy – Declaración If / Else

07L0BQutCRGxUmsECtzDweZ 1.1634325102.fit lim.size 1200x630

Revisión de Asus ZenWiFi ET8 | PCMag