i have heard from a friend of mine that the best algorithm for swapping is " (a^=b^=a^=b)" where a and b are two integers to be swapped. but when i applied this using c language it resulted in crashing. can anyone of you fine people explain the possible reason for that? please suggest the best algorithm for swapping. thank you!!!! guys i would like to know the reason for crashing.
this swapping trick is sometimes dangerous, I have seen a a wrong quicksort program using this swap generates wrong results. But a usual swap generates correct program.
Respect to speed, the compiler sometimes generates faster code if we use a tmp variable.
use tmp = a; a = b; b = tmp;
a^=b^=a^=b
) will only work on integers (and pointers). XOR swap will change both a
and b
to 0 if they are equal. –
Glabrate a
and b
are pointers that point to the same thing. Then (*a)^=(*b)^=(*a)^=(*b)
will zero out the value. In C++ if these are references you can do this without the dereference. But the real reason to use what @Yin Zhu suggests is that your code should be clear, and you shouldn't worry about a micro-optimization like this. –
Marinara a^=b^=a^=b;
probably crashes because it invokes the dreaded undefined behaviour. The rule it breaks is that it modifies a
twice without an intervening sequence point. It can be fixed by inserting some sequence points - for example, with the comma operator:
a ^= (b ^= a ^= b, b);`
Or by breaking it up into multiple statements:
b ^= a ^= b; a ^= b;
It is still, however, usually a bad method for swapping variables - several of the other answers and comments have adequately explained why.
See http://en.wikipedia.org/wiki/Swap_(computer_science) .
Using a temporary variable generates more overhead, but is more stable than the XOR swap algorithm and parallel computing renders it faster than XOR swap.
See the first code example of http://www.ibm.com/developerworks/linux/library/l-metaprog1.html for a solid implementation of using a temporary variable for swapping.
well, in this case we can use Mathematics for swap two Numbers without third variable
- there are some rules which you need to learn which are given below;
assume that you have two variables A = 10 and B = 20 so now if you add them both you get 30 as total right.
Now if you subtract A from total then you get B as a result and if you subtract B from total then you will get A as a result.
For Example:
A = (A+B)-A; //(10 + 20) -10; ===> we will get 20 as a result
B = (A+B)-B; //(10 + 20) -20; ===> we will get 10 as a result
so by this technique you understand that by subtracting one number from total of two number we will get another number as a result.
So Now Final Answer for swapping two Number is Stated Below
A=(A+B)-(B=A)
So here we have subtract A from Total of A and B so we get B in A as result and we get value of A in B by assignment ;``
Write that code that is faster to read by human being. And trust compilers' ability to generate better code most of the time. Do a profiling to see if this is the only place to improve speed. Then apply XOR solutions listed many times above , it may not work every where.
Use this logic for numeric values :
int a = 10, b =5 ;
a = a-b;
b = b+a ; // b gets the original value of a
a = b - a; // a gets the original value of b
printf ("value : %d %d \n",a ,b) ;
a
is INT_MAX
, and b
is INT_MIN
? In other words, a-b
can overflow/underflow. –
Nickels © 2022 - 2024 — McMap. All rights reserved.
std::swap
? – Penmanshipstd::swap
?T temp = one; one = two; two = temp;
? Seriously -- if swap is a speed limiter of your program then you have a problem I'd sure like to have. – Penmanship