线性反馈移位寄存器效率

时间:2015-11-24 14:00:40

标签: c# bit-manipulation shift-register

我有以下代码实现线性反馈移位寄存器的移位动作:

public int DoShift()
{
    //Find new top bit
    int feedback = Contents & tapSequence;
    int newBit = 0;
    for(int i = 1; i <= length; i++)
    {
        newBit = 1 & (newBit ^ feedback);
        feedback >>= 1;
    }
    //Remember falloff, shift register, add new bit
    int result = Contents & 1;
    Contents >>= 1;
    Contents += newBit << (length - 1);
    return result;
}

,其中

  • 内容是注册簿的当前内容
  • tapSequence是XOR抽头序列,其中1代表抽头位,0代表未触发位。
  • length是寄存器的位数。

但是,运行CPU使用率测试后,此功能占用了我运行时间的60%(我认为这是一个相当轻量级的方法)。有没有更有效的方式来写这个? 有没有办法用自己的位对int的内容进行异或(以便取消for循环)?

2 个答案:

答案 0 :(得分:1)

试试这个:

public int DoShift()
{
    int newBit = 1 << (length - 1); // you can save it as class member
    int result = Contents & 1;
    int feedback = Contents & tapSequence;
    Contents >>= 1;
    while(feedback != 0) {
      feedback &= feedback - 1;
      Contents ^= newBit;
    }
    return result;
}

此外,存在更有效的方法,命名为“反向LSFR”。这是一个想法 - 如果结果是1,只需将tapSequence应用于整个寄存器。

参见示例:https://en.wikipedia.org/wiki/Linear_feedback_shift_register

答案 1 :(得分:1)

已经采用以下解决方案:

public int DoShift()
{
    //Remember falloff, shift register, add new bit
    int result = Contents & 1;
    Contents = (Contents >> 1) ^ 
        ((CountBits(Contents & tapSequence) % 2) << (length - 1));
    return result;
}

//Brian Kernighan method of counting bits
public static int CountBits(int value)
{
    int count = 0;
    while (value != 0)
    {
        count++;
        value &= value - 1;
    }
    return count;
}

此外,我也可以尝试一些并行运行更广泛程序的元素。