c - 反转 32 位 int 中的每 4 位

标签 c bit-manipulation

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

0101 1011 1100 0110 becomes
1010 1101 0011 0110

另一个:

1010 1100 0101 1100 becomes
0101 0011 1010 0011

我可以考虑如下反转所有 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;
}

但是如何解决上面的问题呢?

最佳答案

你可以采用complete bit-reversal的算法,并删除几个步骤,只剩下:(未测试)

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

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

关于c - 反转 32 位 int 中的每 4 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22973603/

相关文章:

c - Unix信号如何工作?

变量地址的C地址

java - 如何获得给定数字的下一个二的幂?

c - stdlib 的 qsort 是递归的吗?

c - 从文件中读取C错误

c++ - 将字符串(字符)发送到事件窗口

C# - 如何以某种方式使用枚举标志

c - 如何用 C 将二进制位写入二进制文件?

c++ - 意外的位移结果

c - 编写一个使用指针和位运算符来更改内存中一位的 C 函数?