Byte Order Swapping Function

Jonathan M Davis jmdavisProg at gmx.com
Sun Jul 17 00:44:43 PDT 2011


On Sunday 17 July 2011 15:31:36 KennyTM~ wrote:
> On Jul 17, 11 05:51, Jonathan M Davis wrote:
> > On Saturday 16 July 2011 15:38:29 Andrei Alexandrescu wrote:
> >> Just paste the code here.
> > 
> > This is what I have at the moment:
> > 
> > import core.bitop;
> 
> [snip]
> 
> > private T swapEndianImpl(T)(T val)
> > 
> >      if(is(Unqual!T == ulong))
> > 
> > {
> > 
> >      return ((val&  0xff00000000000000UL)>>  56) |
> >      
> >             ((val&  0x00ff000000000000UL)>>  40) |
> >             ((val&  0x0000ff0000000000UL)>>  24) |
> >             ((val&  0x000000ff00000000UL)>>  8) |
> >             ((val&  0x00000000ff000000UL)<<  8) |
> >             ((val&  0x0000000000ff0000UL)<<  24) |
> >             ((val&  0x000000000000ff00UL)<<  40) |
> >             ((val&  0x00000000000000ffUL)<<  56);
> > 
> > }
> 
> Why not just 'bswap' the two uint parts?

If that will work sure, but thinking about it, I couldn't think of how you 
could use bswap like that. bswap swaps the 4 bytes that it's given. But you 
have to swap each end with each end, not an end with the middle. So, it's not 
like you can use bswap on half of it and then on the other half. I suppose 
that you could use bswap for the middle 4 bytes and then bitshifts for the 2 
bytes on each side, and that would probably be faster. But I don't see how you 
could use bswap to swap any two pieces of a 64-bit integer and properly swap 
it. Now, it may very well be possible and I just don't see it, but I don't see 
it. So, if you know how, please tell me.

- Jonathan M Davis


More information about the Digitalmars-d mailing list