3

ポインターで表される一連のビットがあります。

Bit* bits[32];

ここで、二項右回転演算子を実装する必要があります。最初の部分は、ラップアラウンドしなかったすべてのビットを処理する同じ量の右シフトであることがわかりましたが、ラップアラウンドするものについてどうすればよいかわかりません。

どのビットが最終結果のどの位置に配置されるかを判断するにはどうすればよいですか?

これまでのところ、私は持っています

ExpressionHolder rotate(unsigned int other) const {
    ExpressionHolder out;
    out.e = new Expression;
    for(int i = 0; i < (32 - other); i++) {
        out.e->bits[i] = e->bits[i + other];
    }  
    for(int i = (32 - other); i < 32; i++) {
        out.e->bits[i] = e->bits[31 - i];
    }
    return out;
}

これは正しいです?

4

2 に答える 2

4

std::rotate_copyトリックを行う必要があります

ExpressionHolder rotate( ExpressionHolder const& in, std::size_t count )
{
  ExpressionHolder out;
  out.e = new Expression();

  std::rotate_copy( in.e->bit, in.e->bit + 32 - count, in.e->bit + 32, out.e->bit );
  return out;
}
于 2012-05-29T19:23:04.470 に答える
3

量子力学は、ビットが常に1と0の重ね合わせにあることを示しています。したがって、* e.bits [i]を確認するまで、ポインタの実際のビット値を確認することはできません。

しかし、私たちが簡単に見た後

for(int i = 0; i < 32; i++)
     out.e->bits[i] = e->bits[(i + other) %32];

トリックを行う必要があります。

于 2012-05-29T19:04:16.697 に答える