Efficient Algorithm for Bit Reversal (from MSB->LSB to LSB->MSB) in C

后端 未结 26 1718
情深已故
情深已故 2020-11-22 06:08

What is the most efficient algorithm to achieve the following:

0010 0000 => 0000 0100

The conversion is from MSB->LSB to LSB->MSB. All bits

26条回答
  •  眼角桃花
    2020-11-22 06:54

    I was curious how fast would be the obvious raw rotation. On my machine (i7@2600), the average for 1,500,150,000 iterations was 27.28 ns (over a a random set of 131,071 64-bit integers).

    Advantages: the amount of memory needed is little and the code is simple. I would say it is not that large, either. The time required is predictable and constant for any input (128 arithmetic SHIFT operations + 64 logical AND operations + 64 logical OR operations).

    I compared to the best time obtained by @Matt J - who has the accepted answer. If I read his answer correctly, the best he has got was 0.631739 seconds for 1,000,000 iterations, which leads to an average of 631 ns per rotation.

    The code snippet I used is this one below:

    unsigned long long reverse_long(unsigned long long x)
    {
        return (((x >> 0) & 1) << 63) |
               (((x >> 1) & 1) << 62) |
               (((x >> 2) & 1) << 61) |
               (((x >> 3) & 1) << 60) |
               (((x >> 4) & 1) << 59) |
               (((x >> 5) & 1) << 58) |
               (((x >> 6) & 1) << 57) |
               (((x >> 7) & 1) << 56) |
               (((x >> 8) & 1) << 55) |
               (((x >> 9) & 1) << 54) |
               (((x >> 10) & 1) << 53) |
               (((x >> 11) & 1) << 52) |
               (((x >> 12) & 1) << 51) |
               (((x >> 13) & 1) << 50) |
               (((x >> 14) & 1) << 49) |
               (((x >> 15) & 1) << 48) |
               (((x >> 16) & 1) << 47) |
               (((x >> 17) & 1) << 46) |
               (((x >> 18) & 1) << 45) |
               (((x >> 19) & 1) << 44) |
               (((x >> 20) & 1) << 43) |
               (((x >> 21) & 1) << 42) |
               (((x >> 22) & 1) << 41) |
               (((x >> 23) & 1) << 40) |
               (((x >> 24) & 1) << 39) |
               (((x >> 25) & 1) << 38) |
               (((x >> 26) & 1) << 37) |
               (((x >> 27) & 1) << 36) |
               (((x >> 28) & 1) << 35) |
               (((x >> 29) & 1) << 34) |
               (((x >> 30) & 1) << 33) |
               (((x >> 31) & 1) << 32) |
               (((x >> 32) & 1) << 31) |
               (((x >> 33) & 1) << 30) |
               (((x >> 34) & 1) << 29) |
               (((x >> 35) & 1) << 28) |
               (((x >> 36) & 1) << 27) |
               (((x >> 37) & 1) << 26) |
               (((x >> 38) & 1) << 25) |
               (((x >> 39) & 1) << 24) |
               (((x >> 40) & 1) << 23) |
               (((x >> 41) & 1) << 22) |
               (((x >> 42) & 1) << 21) |
               (((x >> 43) & 1) << 20) |
               (((x >> 44) & 1) << 19) |
               (((x >> 45) & 1) << 18) |
               (((x >> 46) & 1) << 17) |
               (((x >> 47) & 1) << 16) |
               (((x >> 48) & 1) << 15) |
               (((x >> 49) & 1) << 14) |
               (((x >> 50) & 1) << 13) |
               (((x >> 51) & 1) << 12) |
               (((x >> 52) & 1) << 11) |
               (((x >> 53) & 1) << 10) |
               (((x >> 54) & 1) << 9) |
               (((x >> 55) & 1) << 8) |
               (((x >> 56) & 1) << 7) |
               (((x >> 57) & 1) << 6) |
               (((x >> 58) & 1) << 5) |
               (((x >> 59) & 1) << 4) |
               (((x >> 60) & 1) << 3) |
               (((x >> 61) & 1) << 2) |
               (((x >> 62) & 1) << 1) |
               (((x >> 63) & 1) << 0);
    }
    

提交回复
热议问题