elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Es posible intercambiar dos valores sin usar variable auxiliar?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Es posible intercambiar dos valores sin usar variable auxiliar?  (Leído 14,995 veces)
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
¿Es posible intercambiar dos valores sin usar variable auxiliar?
« en: 13 Noviembre 2011, 19:54 pm »

Hola.

Me han planteado dos preguntas. La primera la sé responder.

1. ¿Es posible intercambiar dos valores?

Y yo creo que sí, ya que haciendo lo siguiente en C, me intercambia los valores:

aux=a
a=b
b=aux

Por ejemplo, si a=4 y b=5; con esto será b=4 y a=5, por lo que he comprobado que esa respuesta es correcta.

Ahora viene la segunda pregunta, que es la que no sé...

2. ¿Es posible intercambiar dos valores sin utilizar una variable auxiliar?

En el caso anterior, utilicé la variable "aux", para poder intercambiar los valores de a y b, pero ahora el enunciado dice que no puedo utilizarla.

He probado a poner
a=b
b=a
,pero claro, al poner a=b, en b=a ya estoy diciendo que a=a, por lo que no es correcto.

También he probado con

((a=b) & (b=a)), pero tampoco...

Y bueno, ya en un papel tengo varias posibilidades más, pero son erróneas también...

¿Alguien podría explicarme si es posible?

Muchísimas gracias.


« Última modificación: 13 Noviembre 2011, 19:56 pm por DickGumshoe » En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: ¿Es posible intercambiar dos valores sin usar variable auxiliar?
« Respuesta #1 en: 13 Noviembre 2011, 19:57 pm »

Código
  1. Private Sub lSwap(ByRef lVal1 As Long, ByRef lVal2 As Long)
  2.    '   //  Intercambia {lVal1} por {lVal2} y {lVal2} a {lVal1} sin variable temporal
  3.    lVal1 = lVal1 Xor lVal2
  4.    lVal2 = lVal2 Xor lVal1
  5.    lVal1 = lVal1 Xor lVal2
  6. End Sub
  7.  

Fuente: http://foro.elhacker.net/vb/recopilacion_de_funciones_con_operaciones_binarias-t329680.0.html


En línea

DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: ¿Es posible intercambiar dos valores sin usar variable auxiliar?
« Respuesta #2 en: 13 Noviembre 2011, 20:37 pm »

Código
  1. Private Sub lSwap(ByRef lVal1 As Long, ByRef lVal2 As Long)
  2.    '   //  Intercambia {lVal1} por {lVal2} y {lVal2} a {lVal1} sin variable temporal
  3.    lVal1 = lVal1 Xor lVal2
  4.    lVal2 = lVal2 Xor lVal1
  5.    lVal1 = lVal1 Xor lVal2
  6. End Sub
  7.  

Fuente: http://foro.elhacker.net/vb/recopilacion_de_funciones_con_operaciones_binarias-t329680.0.html

Ah, muchísimas gracias, ya lo entiendo.

Saludos.

P.D.: También he sacado la fórmula de

a=a+b
b=a-b
a=a-b

Muchas gracias.
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: ¿Es posible intercambiar dos valores sin usar variable auxiliar?
« Respuesta #3 en: 13 Noviembre 2011, 20:56 pm »

También he sacado la fórmula de

a=a+b
b=a-b
a=a-b


Con eso provocarias un OverFlow con valores grandes...

Código
  1.  
  2. inline void swap(void* pv1, void* pv2) {
  3.    *((int*)pv1) ^= *((int*)pv2);
  4.    *((int*)pv2) ^= *((int*)pv1);
  5.    *((int*)pv1) ^= *((int*)pv2);
  6. }
  7.  
  8.  

o

Código
  1.  
  2. #define swap(pv1,pv2) pv1 ^= pv2; pv2 ^= pv1; pv1 ^= pv2;
  3.  
  4.  

Te recomiendo la macro...

Dulces Lunas!¡.
« Última modificación: 13 Noviembre 2011, 21:34 pm por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: ¿Es posible intercambiar dos valores sin usar variable auxiliar?
« Respuesta #4 en: 13 Noviembre 2011, 21:10 pm »

Con eso provocacias un OverFlow con valores grandes...

Código
  1.  
  2. inline void swap(void* pv1, void* pv2) {
  3.    *((int*)pv1) ^= *((int*)pv2);
  4.    *((int*)pv2) ^= *((int*)pv1);
  5.    *((int*)pv1) ^= *((int*)pv2);
  6. }
  7.  
  8.  

o

Código
  1.  
  2. #define swap(pv1,pv2) pv1 ^= pv2; pv2 ^= pv1; pv1 ^= pv2;
  3.  
  4.  

Dulces Lunas!¡.

Ya... Lo que pasa que el código del "xor" todavía no lo he dado (tengo 13 años y estoy estudiando con unos apuntes que hay en una web), así que por ahora no lo podré hacer así. Cuando llegue a esa parte, usaré el otro código.

Muchas gracias a todos.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: ¿Es posible intercambiar dos valores sin usar variable auxiliar?
« Respuesta #5 en: 14 Noviembre 2011, 02:50 am »

2. ¿Es posible intercambiar dos valores sin utilizar una variable auxiliar?
Tal vez si o tal vez no (depende del tipo de valor y de los objetos en cuestión). Ese es el problema: ya que no hay una forma realmente genérica para realizar el intercambio (al menos no en C estándar) lo mejor es utilizar una variable temporal y dejarle el resto al compilador.


También he probado con

((a=b) & (b=a)), pero tampoco...
Te recomendaría que no hicieras eso: "tasajear" código para "ver que pasa" y en base al resultado sacar conclusiones. Ello porque si cometes un error en C eso resulta en "comportamiento no definido", en buen cristiano cualquier cosa puede pasar, por ejemplo:

A) El programa revienta
B) Se quema la PC
C) Te deja la novia/amiga con privilegios/etc.
D) Lo peor: todo funciona de maravilla.

Es usualmente el ultimo caso el que da problemas: le das el programa a tu profesor/tutor/etc. y resulta que el bendito programa no funciona en su PC.

Mejor consigue un buen libro y aprende en base a el (y foros como este).

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: ¿Es posible intercambiar dos valores sin usar variable auxiliar?
« Respuesta #6 en: 14 Noviembre 2011, 15:21 pm »

Tal vez si o tal vez no (depende del tipo de valor y de los objetos en cuestión). Ese es el problema: ya que no hay una forma realmente genérica para realizar el intercambio (al menos no en C estándar) lo mejor es utilizar una variable temporal y dejarle el resto al compilador.

Te recomendaría que no hicieras eso: "tasajear" código para "ver que pasa" y en base al resultado sacar conclusiones. Ello porque si cometes un error en C eso resulta en "comportamiento no definido", en buen cristiano cualquier cosa puede pasar, por ejemplo:

A) El programa revienta
B) Se quema la PC
C) Te deja la novia/amiga con privilegios/etc.
D) Lo peor: todo funciona de maravilla.

Es usualmente el ultimo caso el que da problemas: le das el programa a tu profesor/tutor/etc. y resulta que el bendito programa no funciona en su PC.

Mejor consigue un buen libro y aprende en base a el (y foros como este).

Un saludo

Bueno, eso lo hice pensando, solo que no era correcto, y por eso daba error. En realidad no metí eso por probar.

Muchas gracias a todos por haber resuelto mi duda ^^
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Adicionar valores a una variable con ollyscript
Ingeniería Inversa
.:UND3R:. 4 3,287 Último mensaje 21 Octubre 2011, 04:58 am
por Иōҳ
intercambiar valores dentro de un vector
Programación C/C++
bash 8 4,422 Último mensaje 21 Enero 2016, 23:46 pm
por bash
copiar ciertos valores de una variable en otra variable en lenguaje C.
Programación C/C++
fafafa01 9 7,383 Último mensaje 19 Abril 2016, 18:32 pm
por geeke
Como intercambiar valores de un iterator en C++ « 1 2 »
Programación C/C++
alpachino98 14 5,139 Último mensaje 22 Enero 2019, 16:02 pm
por dijsktra
Intercambiar valores de dos variables (batch) --ayuda--
Scripting
juntacadaveres 7 4,089 Último mensaje 24 Abril 2019, 18:08 pm
por Tachikomaia
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines