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 回答