C无符号整数的反转位

10 c binary int unsigned bit-manipulation

我转换的无符号整数使用位运算符为二进制,和目前还整数&1,以检查是否比特是1或0,并且输出,然后通过1右移由2.然而的位被以错误的顺序返回到划分(反转),所以我想在开始之前反转整数中的位顺序.

有一个简单的方法吗?

示例:如果我给了unsigned int 10 = 1010

while (x not eq 0) 
  if (x & 1)
    output a '1'
  else 
    output a '0'
  right shift x by 1
Run Code Online (Sandbox Code Playgroud)

这会返回0101这是不正确的...所以我想在运行循环之前反转最初的位顺序,但我不确定如何做到这一点?

Die*_*Epp 20

反转单词中的位是令人讨厌的,只是以相反的顺序输出它们更容易.例如,

void write_u32(uint32_t x)
{
    int i;
    for (i = 0; i < 32; ++i)
        putchar((x & ((uint32_t) 1 << (31 - i)) ? '1' : '0');
}
Run Code Online (Sandbox Code Playgroud)

这是反转位顺序的典型解决方案:

uint32_t reverse(uint32_t x)
{
    x = ((x >> 1) & 0x55555555u) | ((x & 0x55555555u) << 1);
    x = ((x >> 2) & 0x33333333u) | ((x & 0x33333333u) << 2);
    x = ((x >> 4) & 0x0f0f0f0fu) | ((x & 0x0f0f0f0fu) << 4);
    x = ((x >> 8) & 0x00ff00ffu) | ((x & 0x00ff00ffu) << 8);
    x = ((x >> 16) & 0xffffu) | ((x & 0xffffu) << 16);
    return x;
}
Run Code Online (Sandbox Code Playgroud)

  • 这里的解释是:让我们将块大小为b的所有位分开,从b = 1开始.现在我们交换每个相邻的块.双块大小并重复.继续,直到块大小为字大小的一半.对于32位,这将是5个步骤.每个步骤都可以写成((x&mask)<< b)| ((x&mask')<< b).因此,在5个语句中,我们可以反转32位int. (3认同)
  • @AoeAoe:这有点麻烦.如果你想了解它是如何工作的,我建议用二进制写出数字.每一行将另一半的位的一半位置交换,并且核心中的五行可以按任何顺序写入. (2认同)