Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!ames!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? Summary: works for me Message-ID: <1558@zen.UUCP> Date: 10 Apr 89 10:48:08 GMT References: <1138@uvm-gen.UUCP> <9977@smoke.BRL.MIL> <2345@van-bc.UUCP> <2255@solo5.cs.vu.nl> <1574@lznv.ATT.COM> Reply-To: frank@zen.co.uk (Frank Wales) Organization: Zengrange Limited, Leeds, England Lines: 46 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, since blurfl^blurfl does give 0, but blurfl^0 gives blurfl again, so you should get it back, unless some pretty funky pointer-to-int conversion is taking place. I tried the following myself (admittedly on a fairly well-behaved machine from HP), #include #define ptr_swap(a,b) (a=(void *)((unsigned long)a^(unsigned long)b),\ b=(void *)((unsigned long)a^(unsigned long)b),\ a=(void *)((unsigned long)a^(unsigned long)b)) main(argc,argv) char *argv[]; { char *a=argv[0],*b=argv[0]; (void)printf("a=%lx, b=%lx\n",(unsigned long)a,(unsigned long)b); ptr_swap(a,b); (void)printf("a=%lx, b=%lx\n",(unsigned long)a,(unsigned long)b); return 0; } and got: a=68023000, b=68023000 a=68023000, b=68023000 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.] Or is there some portability problem lurking here that my Monday morning mind has missed? -- 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