Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!csd4.milw.wisc.edu!lll-winken!uunet!mcvax!ukc!etive!hwcs!zen!frank From: frank@zen.co.uk (Frank Wales) Newsgroups: comp.unix.questions Subject: Re: Re^2: Bit Switching - How? Message-ID: <1561@zen.co.uk> Date: 11 Apr 89 09:10:16 GMT References: <1138@uvm-gen.UUCP> <9977@smoke.BRL.MIL> <2345@van-bc.UUCP> <2255@solo5.cs.vu.nl> <1574@lznv.ATT.COM> <1558@zen.UUCP> Reply-To: frank@zen.co.uk (Frank Wales) Organization: Zengrange Limited, Leeds, England Lines: 33 In article <1558@zen.UUCP> I wrote: >In article <1574@lznv.ATT.COM> jlw@lznv.ATT.COM (J.L.WOOD) writes: >>> sl@van-bc.UUCP (pri=-10 Stuart Lynne) writes: >>> \For fast generic swapping I use: >>> >>> \#define swap(a,b) {a^=b;b^=a;a^= b;} >>> >> >>Also be careful how you use this algorithm if you are using pointers. >>I once used this method in a sorting routine as my basic exchange and >>got badly burned. >> >>If a and b point to the same location, you get zero as in 0, nada, goose egg. > >Well, this surprised me, [example of why I thought there was no problem deleted] >I'd be interested to find out the machine on which this XOR trick >fails to swap integral values correctly. [I hardly ever use it, but >I'd still expect it to work.] And indeed it does, except when a and b are the *same* (not the same value, but the same object), because the first a^=b toasts both a and b, and you've lost your recovery information. >Or is there some portability problem >lurking here that my Monday morning mind has missed? Well, it's Tuesday now -- thanks to those who mailed me with a wake-up call [I did say I hardly used the trick myself; good job, too ;-)]. -- Frank Wales, Systems Manager, [frank@zen.co.uk<->mcvax!zen.co.uk!frank] Zengrange Ltd., Greenfield Rd., Leeds, ENGLAND, LS9 8DB. (+44) 532 489048 x217