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