This is a BPC permutation.
Best method found: BPC permutation (about 15 cycles on superscalar processors):
x = bit_permute_step(x, 0x0a0a0a0a, 3); // Bit index swap 0,2 x = bit_permute_step(x, 0x00330033, 10); // Bit index swap+complement 1,3 x = bit_permute_step(x, 0x00000f0f, 20); // Bit index swap+complement 2,4
See documentation to
pext and pdep can be emulated with compress_right and expand_right.
This result is not necessarily the best possible, but at least several methods have been challenged.
See also some notes on the inner workings.
There is an even better calculator calcperm.* which is usable for various word sizes (Pascal and C++ sources).
Error reports, comments or questions? E-mail: firstname.lastname@example.org