Re^2: Bit Switching - How?

Charles Marslett chasm at killer.Dallas.TX.US
Tue Apr 11 21:37:43 AEST 1989


In article <1558 at zen.UUCP>, frank at zen.co.uk (Frank Wales) writes:
:: In article <1574 at lznv.ATT.COM> jlw at lznv.ATT.COM (J.L.WOOD) writes:
:: >> sl at 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),

The problem is that the second part "blurfl^0" is really "0^0" and if the
original algorithm works at all, the result of swapping "blurfl" with
"blurfl" will be zero.

:: #include<stdio.h>
:: #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);

The mistake you made here is that you are swapping "a" and "b", too uncover
the problem with the macro, try substituting the following line:

    ptr_swap(a,a);

The problem arises with pointers because that is where aliasing (and calling
a subroutine with two arguments that are the same address) becomes a problem,
not because the swapped values are pointers.  What I mean to say, is that the
problem is an aliasing one, not a pointer one (Fie!, I can't say anything
clearly today...).

::   (void)printf("a=%lx, b=%lx\n",(unsigned long)a,(unsigned long)b);
::   return 0;
:: }
:: --
:: Frank Wales, Systems Manager,        [frank at zen.co.uk<->mcvax!zen.co.uk!frank]
:: Zengrange Ltd., Greenfield Rd., Leeds, ENGLAND, LS9 8DB. (+44) 532 489048 x217 

Charles
===========================================================================
Charles Marslett
STB Systems, Inc.  <== Apply all standard disclaimers
Wordmark Systems   <== No disclaimers required -- that's just me
chasm at killer.dallas.tx.us



More information about the Comp.unix.questions mailing list