elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 22:27  


Tema destacado: Nueva página de elhacker.net en Google+ Google+

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  ¿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 1,168 veces)
DickGumshoe

Desconectado Desconectado

Mensajes: 145


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

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 por DickGumshoe » En línea
raul338


Desconectado Desconectado

Mensajes: 2.371


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 »

Código
Private Sub lSwap(ByRef lVal1 As Long, ByRef lVal2 As Long)
   '   //  Intercambia {lVal1} por {lVal2} y {lVal2} a {lVal1} sin variable temporal
   lVal1 = lVal1 Xor lVal2
   lVal2 = lVal2 Xor lVal1
   lVal1 = lVal1 Xor lVal2
End Sub
 

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


En línea

DickGumshoe

Desconectado Desconectado

Mensajes: 145


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

Código
Private Sub lSwap(ByRef lVal1 As Long, ByRef lVal2 As Long)
   '   //  Intercambia {lVal1} por {lVal2} y {lVal2} a {lVal1} sin variable temporal
   lVal1 = lVal1 Xor lVal2
   lVal2 = lVal2 Xor lVal1
   lVal1 = lVal1 Xor lVal2
End Sub
 

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 (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


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

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
 
inline void swap(void* pv1, void* pv2) {
   *((int*)pv1) ^= *((int*)pv2);
   *((int*)pv2) ^= *((int*)pv1);
   *((int*)pv1) ^= *((int*)pv2);
}
 
 

o

Código
 
#define swap(pv1,pv2) pv1 ^= pv2; pv2 ^= pv1; pv1 ^= pv2;
 
 

Te recomiendo la macro...

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

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
DickGumshoe

Desconectado Desconectado

Mensajes: 145


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

Con eso provocacias un OverFlow con valores grandes...

Código
 
inline void swap(void* pv1, void* pv2) {
   *((int*)pv1) ^= *((int*)pv2);
   *((int*)pv2) ^= *((int*)pv1);
   *((int*)pv1) ^= *((int*)pv2);
}
 
 

o

Código
 
#define swap(pv1,pv2) pv1 ^= pv2; pv2 ^= pv1; pv1 ^= pv2;
 
 

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: 382


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

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

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
DickGumshoe

Desconectado Desconectado

Mensajes: 145


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

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
Diferentes valores a variable PHP
Desarrollo Web
Azielito 14 1,766 Último mensaje 12 Enero 2004, 10:14
por Azielito
Intercambiar dos variables sin usar una auxiliar
Programación C/C++
ny0x 2 2,246 Último mensaje 16 Junio 2009, 21:38
por andi1991
[batch] comparar una variable con varios valores
Scripting
moikano→@ 13 1,665 Último mensaje 22 Diciembre 2010, 19:25
por moikano→@
[RUBY] Es posible variable distinta dentro de for?
Scripting
tbgio 7 584 Último mensaje 27 Julio 2011, 21:54
por tbgio
Adicionar valores a una variable con ollyscript
Ingeniería Inversa
.:UND3R:. 4 356 Último mensaje 21 Octubre 2011, 04:58
por Иōҳ
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines