表示位在数组中表示的旋转

Expressing rotation where bits are represented in array

本文关键字:表示 旋转 数组      更新时间:2023-10-16

我有一系列位,由指针表示。

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;
}

这是对的吗?

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;
}

量子力学规定比特总是处于 1 和 0 的叠加态。因此,在我们查看 *e.bits[i] 之前,我们永远无法确定指针的实际位值。

但是在我们看一个直截了当之后

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

应该做这个伎俩。