反转位明显的方式

时间:2013-02-20 03:31:51

标签: c++ c bit-manipulation

我看到了链接http://pvtridvs.net/pool/bithacks.html#BitReverseObvious并在此处发布了代码:

unsigned int v;         // reverse the bits in this
unsigned int t = v;     // t will have the reversed bits of v
int i;

for (i = sizeof(v) * 8 - 1; i; i--)
{
  t <<= 1;
  v >>= 1;
  t |= v & 1;
}

有人会解释为什么这个简单的算法有效吗?我在纸上测试了一些最简单的例子,比如4位0011等,它可以工作,但我根本不明白为什么这3行移位和逐位操作可以实现它。

2 个答案:

答案 0 :(得分:4)

它将v和“in”的低位置“移出”到t的低位。将变量视为位堆栈。您正在弹出v中的位并将其推入t。从一个列表弹出并推送到另一个最初为空的列表是一种反转任何列表的简单方法。初始化只是将最低阶位的初始“推”执行到结果上。这个技巧可以节省一只小狗并推动(即右移和左移)。例如。对于一个字节,只需要7个pop-push。

答案 1 :(得分:0)

每轮t向上移动一个位置,v向下移动一个位置;并且v的当前最后一个位于t的末尾。