Perform a perfect shuffle of the bits of 64-bit integer, shuffling bits from 'abcd efgh ijkl mnop ABCD EFGH IJKL MNOP' to 'aAbB cCdD eEfF gGhH iIjJ kKlL mMnN oOpP'. See http://www.icodeguru.com/Embedded/Hacker's-Delight/047.htm
| 46 | // 'abcd efgh ijkl mnop ABCD EFGH IJKL MNOP' to 'aAbB cCdD eEfF gGhH iIjJ kKlL mMnN oOpP'. |
| 47 | // See http://www.icodeguru.com/Embedded/Hacker's-Delight/047.htm |
| 48 | constexpr uint64_t PerfectShuffle(uint64_t x) |
| 49 | { |
| 50 | x = ((x & 0x00000000FFFF0000ULL) << 16) | ((x >> 16) & 0x00000000FFFF0000ULL) | (x & 0xFFFF00000000FFFFULL); |
| 51 | x = ((x & 0x0000FF000000FF00ULL) << 8) | ((x >> 8) & 0x0000FF000000FF00ULL) | (x & 0xFF0000FFFF0000FFULL); |
| 52 | x = ((x & 0x00F000F000F000F0ULL) << 4) | ((x >> 4) & 0x00F000F000F000F0ULL) | (x & 0xF00FF00FF00FF00FULL); |
| 53 | x = ((x & 0x0C0C0C0C0C0C0C0CULL) << 2) | ((x >> 2) & 0x0C0C0C0C0C0C0C0CULL) | (x & 0xC3C3C3C3C3C3C3C3ULL); |
| 54 | x = ((x & 0x2222222222222222ULL) << 1) | ((x >> 1) & 0x2222222222222222ULL) | (x & 0x9999999999999999ULL); |
| 55 | return x; |
| 56 | } |
| 57 | |
| 58 | // Reverses the perfect shuffle of bits in a 64-bit integer |
| 59 | constexpr uint64_t PerfectUnshuffle(uint64_t x) |
no outgoing calls