以32位int反转每4位

use*_*025 1 c bit-manipulation

反转每4位中的每个位,例如:

0101 1011 1100 0110 becomes
1010 1101 0011 0110
Run Code Online (Sandbox Code Playgroud)

另一个:

1010 1100 0101 1100 becomes
0101 0011 1010 0011
Run Code Online (Sandbox Code Playgroud)

我可以考虑将所有32位反转如下:

unsigned int reverseBits(unsigned int num)
{
    unsigned int count = sizeof(num) * 8 - 1;
    unsigned int reverse_num = num;

    num >>= 1; 
    while(num)
    {
       reverse_num <<= 1;       
       reverse_num |= num & 1;
       num >>= 1;
       count--;
    }
    reverse_num <<= count;
    return reverse_num;
}
Run Code Online (Sandbox Code Playgroud)

但是如何解决上述问题呢?

har*_*old 9

您可以采用算法进行完全位反转,并删除几个步骤,只需:(未测试)

x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1);  // swap odd/even bits
x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2);  // swap groups of 2
Run Code Online (Sandbox Code Playgroud)

显然,假设无符号整数是32位.