Red de conocimientos sobre prescripción popular - Conocimiento dental - ¿Cómo intercambiar los valores de dos números sin utilizar una tercera variable?

¿Cómo intercambiar los valores de dos números sin utilizar una tercera variable?

Operaciones aritméticas; operaciones de dirección de puntero; implementación de pila.

Las operaciones específicas son las siguientes:

Operaciones aritméticas

int a, b

a = 10;

a = b-a; //a = 2; b=12

b = b-a; //a = 2; b=10

a = b+ a;/ /a = 10; b=10

El principio es: tratar A y B como puntos en el eje numérico y calcular alrededor de la distancia entre los dos puntos.

Proceso específico: la primera oración "a=b-a" encuentra la distancia entre dos puntos ab y la guarda en A; la segunda oración "b=b-a" encuentra la distancia desde A hasta el origen (la distancia). entre B y el origen) y la distancia desde los dos puntos hasta ab) y guardarla en B; la tercera oración "a=b+a" calcula la distancia desde B hasta el origen (la suma de la distancia desde A); al origen y la distancia desde ab al origen) y lo guarda en A, se completa el intercambio.

En comparación con el algoritmo estándar, este algoritmo tiene tres procesos de cálculo más, pero no utiliza variables temporales. (en lo sucesivo denominado algoritmo aritmético)

Desventajas: solo se puede utilizar para tipos numéricos, no para cadenas y similares. A+b puede desbordarse (más allá del rango de int), el desbordamiento es relativo, + se desborda, - simplemente regresa, por lo que no importa si se desborda o no, simplemente no es seguro.

Operación de dirección del puntero

int *a, * b; // Supuesto

* a = new int(10);

* b = nuevo int(20); //& a=0x00001000h. b=0x00001200h

a =(int *)(b-a); //& a = 0x00000200h. b=0x00001200h

b =(int *)(b-a); //& a = 0x00000200h. b=0x00001000h

a =(int *)(b+int(a)); //& a=0x00001200h. b=0x00001000h

Debido a que la operación de dirección es en realidad una operación de número entero, por ejemplo, se restan dos direcciones para obtener un número entero, lo que indica cuántos bytes están separadas las ubicaciones de almacenamiento de las dos variables en la memoria; la dirección se suma a un número entero arriba, es decir, "a+10" representa las direcciones de 10 unidades de datos de clase A con A como dirección base. Por lo tanto, en teoría, el intercambio de direcciones se puede completar mediante operaciones similares a los algoritmos aritméticos, logrando así el propósito de intercambiar variables.

Operaciones de bits

int a=10, b = 12; //a=1010^b=1100;

a=a^b;// a=0110^b=1100;

b=a^b; //a=0110^b=1010;

a=a^b; //a = 1100 = 12; b = 1010;

La implementación de este algoritmo está determinada por las características de la operación XOR. La operación XOR puede invertir algunos bits de los datos mientras otros bits permanecen sin cambios. Esto significa que cualquier número y cualquier valor dado se aplica XOR dos veces seguidas y el valor sigue siendo el mismo.

Implementación de pila.

int intercambio(int x, int y)?

{?

Apilar S;?

empujar(S,x);?

empujar(S, y);?

x = pop(S);?

y = pop(S);?

}

Todos los algoritmos anteriores implementan el intercambio de dos valores de variables sin otras variables. En comparación, la cantidad de cálculo del algoritmo aritmético y el algoritmo de bits es equivalente. El cálculo en el algoritmo de dirección es más complicado, pero el intercambio de tipos grandes (como clases o estructuras definidas por el usuario) se puede realizar fácilmente, mientras que los dos primeros pueden realizarse. solo intercambia datos enteros (en teoría, los operadores pueden sobrecargarse y se pueden intercambiar estructuras arbitrarias).