我有一个如下数组,
unsigned char A[16]
我使用这个数组来表示一个128位的硬件寄存器。现在我想用这个长寄存器实现一个线性反馈移位寄存器(LFSR,斐波那契实现)。连接到该LFSR的反馈异或门的多项式(或抽头)是128,29,27,2,1。
16位LFSR的实现(16、14、13、11处的抽头)可以从Wikipedia获得,如下所示。
unsigned short lfsr = 0xACE1u;
unsigned bit;
unsigned rand()
{
bit = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1;
return lfsr = (lfsr >> 1) | (bit << 15);
}然而,在我的例子中,我需要将位从一个字节元素移到另一个字节元素,例如,msb或A需要移位到A1的lsb。完成这种转换的最小编码是什么?谢谢!
发布于 2011-10-20 11:00:45
要计算要移位的位,不需要每次都对整个数组进行移位,因为您只对一个位感兴趣(请注意维基百科bit =行末尾的& 1 )。
正确的移位量是:
128 - 128 = 0 => byte 0 bit 0
128 - 29 = 99 => byte 12 bit 3
128 - 27 = 101 => byte 12 bit 5
128 - 2 = 126 => byte 15 bit 6
128 - 1 = 127 => byte 15 bit 7所以,
bit = ((A[0] >> 0)
^ (A[12] >> 3)
^ (A[12] >> 5)
^ (A[15] >> 6)
^ (A[15) >> 7)) & 1;现在,你真的需要改变一下了:
A[0] = (A[0] >> 1) | (A[1] << 7);
A[1] = (A[1] >> 1) | (A[2] << 7);
// and so on, until
A[14] = (A[14] >> 1) | (A[15] << 7);
A[15] = (A[15] >> 1) | (bit << 7);您可以通过使用uint32_t或uint64_t代替无符号字符(取决于您的处理器字长)来提高效率,但原理是相同的。
https://stackoverflow.com/questions/7830379
复制相似问题