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ます。あるリストからポップして、最初は空の別のリストにプッシュするのは、リストを元に戻す簡単な方法です。初期化は、結果に対して最下位ビットの最初の「プッシュ」を実行するだけです。このトリックは、1人の子犬とプッシュ(つまり、右と左のシフト)を節約します。たとえば、1バイトの場合、あと7つのポッププッシュだけが必要です。

于 2013-02-20T03:34:52.587 に答える
0

各ラウンドtは1つ上にvシフトされ、1つ下にシフトされます。現在最後ですが、のvは。の最後に配置されtます。

于 2013-02-20T03:35:33.137 に答える