Byte Order Swapping Function

Jonathan M Davis jmdavisProg at gmx.com
Sun Jul 17 01:16:43 PDT 2011


On Sunday 17 July 2011 16:09:13 KennyTM~ wrote:
> On Jul 17, 11 15:44, Jonathan M Davis wrote:
> > 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
> 
> import core.bitop;
> private ulong swapEndianImpl(ulong val) {
>      ulong res = bswap(val & 0xffff_ffff);
>      return res << 32 | bswap(val >> 32);
> }
> unittest {
>      assert(swapEndianImpl(0xfedcba98_76543210UL) == 0x10325476_98badcfeUL);
> }

Ah. Okay. Thanks.

- Jonathan M Davis


More information about the Digitalmars-d mailing list