我有以下代码实现线性反馈移位寄存器的移位动作:
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;
}
,其中
但是,运行CPU使用率测试后,此功能占用了我运行时间的60%(我认为这是一个相当轻量级的方法)。有没有更有效的方式来写这个? 有没有办法用自己的位对int的内容进行异或(以便取消for循环)?
答案 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;
}
此外,我也可以尝试一些并行运行更广泛程序的元素。