Warning: lots of 0 and 1 ahead. Typos are lurking...
On Thu, Jul 25, 2002 at 12:08:09AM +0800, Connie Chan wrote: > In normal case, when we want to swap 2 var, > , say $x and $y, we do in this way : > > $z = $x; $x = $y; $y = $z; # Swapped > > today, I suddenly found a code like this : > > $x ^= $y ; $y ^= $x ; $x ^= $y; # Swapped > > It works !! but how that works ? > Could anybody tell me ? XORing a variable twice with the same value restores its original value: $a = 0x55 $b = 0xff $a xor $b xor $b gives the old $a 0x55 xor 0xff xor 0xff is a no-op. Now, letst do one xor and store this in $a. No information is lost and $a now documents the differences between $a_old and $b. Note that the order in an xor operation is interchangable $a xor $b <=> $b xor $a So, by doing the xor again, but not storing it in $a and recovering the initial state, but storing it in $b, we've assigned the initial $a to $b. Now, $a still contains the initial differences between the two and $b contains the initial $a. Remember, the XORs are interchangeble. We have the initial $a and the differences, which must result in the initial $b when XORed. Assigning the result to $a finishes the swap. 0. $a = 0x55 => 01010101 binary $b = 0xff => 11111111 binary 1. $a 01010101 XOR $b 11111111 Is 10101010 which goes into $a (These are the differences) 2. $a 10101010 XOR $b 11111111 Is 01010101 which goes into $b ($b now contains $a_initial) 3. $a 10101010 XOR $b 11111111 Is 01010101 which then goes into $a ($a now contains $b_initial) <voice name="Kelly Bundy">Vioooola!</voice> Try different numbers like 0x55 vs 0xaa or 0x33 vs 0xaa... It's an old trick from the Assembler times. XOR was 1cycle op and the whole thing only needed 2 registers. The alternative would have been a 3rd register or a memory/stack operation. Drieux might provide us with some benchmarks about which one's faster these days... ;-) -- Well, then let's give that Java-Wussie a beating... (me) Michael Lamertz | +49 221 445420 / +49 171 6900 310 Nordstr. 49 | [EMAIL PROTECTED] 50733 Cologne | http://www.lamertz.net Germany | http://www.perl-ronin.de -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]