2

我看到了链接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 行移位和按位运算可以实现它。

4

2 回答 2

4

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

于 2013-02-20T03:34:52.587 回答
0

每轮t上移一个位置,v下移一个位置;并且当前最后一个 but ofv被放置在t.

于 2013-02-20T03:35:33.137 回答